在 R 中使用 lapply 将条件列添加到嵌套数据框列表

Add conditional columns to list of nested data frames using lapply in R

我正在尝试简化下面的代码。我想从长到宽投射数据框列表,然后根据数据集中包含的变量向每个嵌套数据框添加几个变量。下面的代码产生了我的首选输出,我想帮助理解如何减少步骤并可能在一个 lapply 命令中完成所有这些。我尝试了几次组合 "with" 语句的试验,但都无济于事。

dflist <- list(data.frame(ID=(c(rep(1,10),rep(2,10))),Y=(c(rep(1,5),rep(2,5),rep(1,5),rep(2,5))), b=rnorm(20),c=rnorm(20)),
           data.frame(ID=(c(rep(1,10),rep(2,10))), Y=(c(rep(1,5),rep(2,5),rep(1,5),rep(2,5))),b=rnorm(20),c=rnorm(20)),
           data.frame(ID=(c(rep(1,10),rep(2,10))), Y=(c(rep(1,5),rep(2,5),rep(1,5),rep(2,5))),b=rnorm(20),c=rnorm(20)))


wide_data<-lapply(dflist, function(x) dcast(setDT(x), ID ~ Y, value.var=c('b','c'),mean))

b_flag<-lapply(wide_data, function(x) with(x,ifelse((b_1 < .30 | b_2 >.95),"Flag",NA)))
c_flag<-lapply(wide_data, function(x) with(x,ifelse((c_1 < 0) & (c_1 < 0),"Flag",NA)))

wide_data<-Map(cbind, wide_data, b_flag = b_flag)                
wide_data<-Map(cbind, wide_data, c_flag = c_flag) 
wide_data

我同意你的看法,1 lapply 会更好:

wide_data <- lapply(dflist, function(x) {
    tmp <- dcast(setDT(x), ID ~ Y, value.var=c('b','c'), mean)
    tmp$b_flag <- ifelse((tmp$b_1 < .30 | tmp$b_2 >.95) , "Flag", NA)
    tmp$c_flag <- ifelse((tmp$c_1 < 0) & (tmp$c_2 < 0), "Flag", NA)
    tmp
})

不使用 dcast

的另一种方法

此外,c 列的条件在您的问题中不明确。请检查是否正确并编辑您的问题。

library('data.table')
df2 <- lapply( dflist, function(x) {
  x <- setDT(x)[, .(b = mean(b), c = mean(c)), by = .(ID, Y)]
  x[ , `:=` ( b_flag = ifelse( any(b[Y == 1 ] < 0.30, b[Y == 2] > 0.95), "Flag", NA_character_ ),
              c_flag = ifelse( all(c < 0), "Flag", NA_character_ ) ),
     by = ID ]
  return( x )
  } )
df2 <- rbindlist(l = df2)
df2
#     ID Y            b           c b_flag c_flag
#  1:  1 1  0.198227292  0.57377712   Flag     NA
#  2:  1 2  0.578991810  0.40128112   Flag     NA
#  3:  2 1  0.578724225  0.30608932     NA     NA
#  4:  2 2  0.619338292  0.35209122     NA     NA
#  5:  1 1  0.321089583 -0.83979393     NA     NA
#  6:  1 2 -0.341194581  0.52508394     NA     NA
#  7:  2 1  0.179836568 -0.02041203   Flag     NA
#  8:  2 2  0.482725899  0.17163968   Flag     NA
#  9:  1 1  0.003591178 -0.30250232   Flag     NA
# 10:  1 2 -0.230479093  0.01971357   Flag     NA
# 11:  2 1 -0.038689389  0.35717286   Flag     NA
# 12:  2 2  0.691364217 -0.37037455   Flag     NA