Нахождение первого ненулевого года во фрейме данных для нескольких переменных с использованием tidyverse - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть следующие данные:

library(tidyverse)
set.seed(1)
test <- data.frame(id = c(rep(1, 3), rep(2, 4), rep(3, 5)),
                   Year = 2000 + c(1,3,5,2,3,5,6,1,2,3,4,5),
                   var1 = sample(0:2, replace = TRUE, size = 12, prob = c(0.6, 0.3, 0.1)),
                   var2 = sample(0:2, replace = TRUE, size = 12, prob = c(0.6, 0.3, 0.1)))

Мне нужен первый год, чтобы каждая переменная (var1 и var2) была ненулевой в каждой группе идентификаторов.

Я знаю, как найти номер строки первой ненулевой строки:

temp <- function(a) ifelse(length(head(which(a>0),1))==0,0,head(which(a>0),1))

test2 <- test %>% group_by(id) %>% 
mutate_at(vars(var1:var2),funs(temp)) %>%
filter(row_number()==1) %>% select (-year)

     id  var1  var2
1     1   0     1
2     2   1     2
3     3   1     1

Однако я не уверен, как сопоставить номер строки с переменной года, чтобы точно знать, когда*

Это то, что я хочу:

     id  var1  var2
1     1   0     2001
2     2   2002  2003
3     3   2001  2001
: var1 и var2 стали ненулевыми?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Немного другой подход - сначала собрать все в большой длинный файл:

test %>%
  gather(var, value, var1:var2) %>%
  filter(value != 0) %>%
  group_by(id, var) %>%
  summarise(Year = min(Year)) %>%
  spread(var, Year)

## A tibble: 3 x 3
## Groups:   id [3]
#     id  var1  var2
#* <dbl> <dbl> <dbl>
#1  1.00    NA  2001
#2  2.00  2002  2003
#3  3.00  2001  2001

И базовую версию R для развлечения:

tmp <- cbind(test[c("id", "Year")], stack(test[c("var1","var2")]))
tmp <- tmp[tmp$values != 0,]
tmp <- aggregate(Year ~ id + ind, data=tmp, FUN=min)
reshape(tmp[c("id","ind","Year")], idvar="id", timevar="ind", direction="wide")
0 голосов
/ 11 декабря 2018

Мы можем сделать следующее:

test %>% group_by(id) %>% summarise_at(vars(var1:var2), funs(Year[. > 0][1]))
# A tibble: 3 x 3
#      id  var1  var2
#   <dbl> <dbl> <dbl>
# 1     1    NA  2001
# 2     2  2002  2003
# 3     3  2001  2001

То есть . > 0 дает логический вектор с TRUE всякий раз, когда значение положительно, тогда мы выбираем все соответствующие годы и, наконец, выбираем толькопервый.

Это очень похоже на ваш подход.Обратите внимание, что из-за использования summarise мне больше не нужно filter(row_number()==1) %>% select (-year).Кроме того, моя функция, соответствующая temp, более краткая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...