我有一个看起来像这样的数据框
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)
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)