簡體   English   中英

在R中使用lapply將條件列添加到嵌套數據幀列表中

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

我正在嘗試簡化下面的代碼。 我想從長到寬投射一個數據幀列表,然后根據數據集中包含的變量向每個嵌套數據幀添加幾個變量。 以下代碼產生了我的首選輸出,我想幫助您了解如何減少步驟,並可能在一個lapply命令中全部完成。 我嘗試了幾次嘗試,將“與”語句組合在一起均無濟於事。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM