Найдите позицию первого значения, превышающего 0, в столбце A и верните значение в этой позиции в столбце B

#r #dataframe #subset

Вопрос:

Я новичок в R, и я борюсь с этой проблемой: я хочу оценить значения в столбце A и получить положение первого ненулевого значения в этом столбце. Затем я хочу получить значение в найденной позиции, но в столбце B. Это должно было бы произойти в фрейме данных, подобном этому.

Колонка А Колонка В
0 1998
0 1997
2 1996
3 1995

Таким образом, результат должен быть: 1996 год.

Я безуспешно пытался использовать match (). Заранее спасибо.

Ответ №1:

Если ваше А неотрицательно

 B[ match(FALSE, cummax(A) == 0) ]
 

Ответ №2:

Оба существующих ответа великолепны. Просто подумал, что завершу это с помощью метода tidyverse, который вполне читаем:

 library(dplyr)

dat %>%
    filter(`Column A` > 0) %>%
    slice(1) %>%
    pull(`Column B`)
 

Данные:

 dat <- tribble(
    ~`Column A`, ~`Column B`,
    0,         1998,
    0,         1997,
    2,         1996,
    3,         1995
)
 

Комментарии:

1. Менее читаемый, но более короткий: dat %>% filter( Столбец A` > 0) %>>% >> [[ (1, «Колонка В»)`. 😉

Ответ №3:

Еще один базовый вариант R

 with(
  df,
  ColumnB[which.min(ColumnA <= 0)]
)
 

что дает

 [1] 1996
 

Ответ №4:

Мы можем использовать base R функции, т. е. with — создать логическое условие с «Столбцом A», подмножество соответствующих элементов «Столбца B», где логическое условие ИСТИННО, и использовать индексацию [1] для возврата первого элемента

 with(df1, `Column B`[`Column A` > 0][1])
 

Если имя столбца хранится в другом объекте

 obj1 <- 'Column A'
df1[["Column B"]][df1[[obj1]] > 0][1]
 

Комментарии:

1. Это сделало свое дело! Спасибо! Просто для справки на случай, если кто-то вроде меня читает это, если вы не укажете [1], он вернет вектор вместо только первого значения.