#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], он вернет вектор вместо только первого значения.