【问题标题】:r data.table lapply with multiple SDcolsr data.table lapply 与多个 SDcols
【发布时间】:2020-11-21 19:39:04
【问题描述】:

我正在尝试使用 lapply,它在看似简单的代码行中考虑了两个列列表(均为数字类型),但输出与预期不符。

这是我的代码:

x<-50

measure <- c("haz", "waz", "whz", "htcm", "wtkg", "bmi")
new_measure_1.5 <- paste(measure, "1.5", sep = "_")
new_temp_cols<-paste("temp", new_measure_1.5, sep = "_")
new_columns<-paste(new_measure_1.5, "1", sep="_")

newcols_1.5_months<-function(x, agedays, new_temp_cols, y){
    ifelse(agedays==x, new_temp_cols, y)
  }

DT[, (new_columns) := lapply(.SD, function(y) newcols_1.5_months(x, agedays, new_temp_cols, y)), .SDcols = new_columns ]

上面的代码导致 new_columns (haz_1.5_1, waz_1.5_1, whz_1.5_1, wtkg_1.5_1, htcm_1.5_1, bmi_1.5_1) 包含列表 new_temp_cols (temp_haz_1.5, temp_waz_1) 中的列名.5, temp_whz_1.5, temp_wtkg_1.5, temp_htcm_1.5, temp_bmi_1.5) 而不是它们在我的数据表中保存的值。似乎 R 正在将列表读取为字符串向量而不是列向量。这是为什么呢?

我尝试过使用多个 .SDcol,但这不起作用:

DT[, (new_columns) := lapply(.SD, function(y) newcols_1.5_months(x, agedays, new_temp_cols, y)), .SDcols = c(new_columns, new_temp_cols) ]

有没有简单的解决办法?

**** 编辑以添加类似于我的数据表的一小部分虚拟数据

measure<-c("haz", "waz")
new_measure_1.5 <- paste(measure, "1.5", sep = "_")
new_temp_cols<-paste("temp", new_measure_1.5, sep = "_")
new_columns<-paste(new_measure_1.5, "1", sep="_")


anthro <- data.table

    (agedays = c(25,50,53,22,37,50,12,45,50,15,33,50),
                               temp_haz_1.5 = c(1.2,1.5,1.7,2.0,4.5,6.7,6.8,6.7,4.5,6.6,8.9,6.7),
                               temp_waz_1.5 = c(3.2,1.8,6.7,2.8,3.5,7.7,9.8,1.7,6.9,3.8,0.9,4.7),
                   haz_1.5_1 = c(1.2,2.5,4.7,7.0,4.7,6.8,6.3,2.7,5.5,8.6,3.9,6.7),  
                   waz_1.5_1 =c(6.2,2.5,5.7,7.0,2.5,7.7,8.8,9.7,2.5,4.6,5.9,6.7))

【问题讨论】:

  • (1) 你提到new_measure_3.5 但定义new_measure_1.5,错字? (2) new_columns 明确包含这些名称,因此 data.table 将保留这些名称是有道理的。示例数据将在此处提供信息。
  • @r2evans 是的,这是一个错字!对不起,这很尴尬。我刚刚编辑了我的帖子来解决这个问题。感谢您指出。
  • @akrun 刚刚编辑了帖子以添加一些虚拟数据
  • 你能检查我下面的代码吗

标签: r data.table lapply


【解决方案1】:

如果我们有多个列,则使用Map 循环遍历每组对应的列并应用函数。

library(data.table)
x <- 50
DT[, (new_columns) := Map(function(u, y) 
    newcols_1.5_months(u, DT[['agedays']], x, y),
    .SD[, new_columns, with = FALSE], 
       .SD[, new_temp_cols, with = FALSE]) ]

也许功能可以

newcols_1.5_months<- function(u, agedays, x,  y){
      ifelse(agedays==x, u, y)
   }

数据

DT <- data.table(agedays = c(25,50,53,22,37,50,12,45,50,15,33,50),
                               temp_haz_1.5 = c(1.2,1.5,1.7,2.0,4.5,6.7,6.8,6.7,4.5,6.6,8.9,6.7),
                                temp_waz_1.5 = c(3.2,1.8,6.7,2.8,3.5,7.7,9.8,1.7,6.9,3.8,0.9,4.7),
                    haz_1.5_1 = c(1.2,2.5,4.7,7.0,4.7,6.8,6.3,2.7,5.5,8.6,3.9,6.7),  
                    waz_1.5_1 =c(6.2,2.5,5.7,7.0,2.5,7.7,8.8,9.7,2.5,4.6,5.9,6.7))

【讨论】:

  • 因为 x 是在年龄值 (x==50) 的函数之前给出的,我应该添加另一个变量来代替 x 吗?这不只是通过 new_columns 携带 x (50) 吗?
  • 我运行了代码和其中 agedays==x 仅在 new_columns 中保存 NA 值的单元格
  • @boodaloo1 我了解您有两组列的问题,如果“agedays”列等于第一组列,您想比较它们,替换为第二组的值
  • @boodaloo1 好的。这就是混乱。我会改变
  • 今天早上我回到了我的代码并能够修复 NA 值。唯一的问题是两行变量(new_columns 和 new_temp_cols)出现故障。我交换了订单,它起作用了。快速解决!感谢您的所有帮助!
猜你喜欢
  • 2018-06-22
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
相关资源
最近更新 更多