改变 dplyr 以选择变量的第一个值

rjs*_*jss 2 r dplyr

我有一个看起来像这样的数据框

test<-data.frame(x=c(100,100,101,101,102,102),y=c(1,2,1,2,1,2),z=c(NA,NA,0.1,NA,NA,0.5))
Run Code Online (Sandbox Code Playgroud)

我想按 x 分组。然后创建一个新变量 ynew,我将在其中查看 z 并选择第一个不是 NA 的值,然后设置 ynew=y。如果 z 中的两个值均为 NA,那么我希望 ynew 为 NA。ynew 应该是 NA,NA,1,1,2,2。我正在尝试使用 dplyr 来做到这一点。

我被以下问题困住了

group_by(test,x) %>% mutate(ynew=ifelse(all(is.na(z)),NA_integer_,y[corresponding index]))
Run Code Online (Sandbox Code Playgroud)

mto*_*oto 5

test如果是以下 dplyr 方法,则有效data.table

library(data.table)
test <- data.table(test)

test %>% group_by(x) %>% mutate(ynew = first(y[!is.na(z)]))

# Source: local data table [6 x 4]

#      x     y     z  ynew
#   (dbl) (dbl) (dbl) (dbl)
#1   100     1    NA    NA
#2   100     2    NA    NA
#3   101     1   0.1     1
#4   101     2    NA     1
#5   102     1    NA     2
#6   102     2   0.5     2
Run Code Online (Sandbox Code Playgroud)

或者你可以简单地使用这种data.table方式

test[, ynew := y[!is.na(z)], x]
Run Code Online (Sandbox Code Playgroud)