【问题标题】:R data.table create new columns with standard namesR data.table 使用标准名称创建新列
【发布时间】:2018-04-17 12:25:23
【问题描述】:

我想根据比率计算为我的 data.table 创建新列。我的变量名称稍微有点标准,所以我认为必须有一种方法可以在 data.table 中轻松实现这一点。但是我无法获得如何实现这一目标。以下是我的示例数据和代码 -

set.seed(1200)

ID <- seq(1001,1100)
region <- sample(1:10,100,replace = T)
Q21 <- sample(1:5,100,replace = T)
Q22 <- sample(1:15,100,replace = T)
Q24_LOC_1 <- sample(1:8,100,replace = T)
Q24_LOC_2 <- sample(1:8,100,replace = T)
Q24_LOC_3 <- sample(1:8,100,replace = T)
Q24_LOC_4 <- sample(1:8,100,replace = T)

Q21_PAN <- sample(1:5,100,replace = T)
Q22_PAN <- sample(1:15,100,replace = T)
Q24_LOC_1_PAN <- sample(1:8,100,replace = T)
Q24_LOC_2_PAN <- sample(1:8,100,replace = T)
Q24_LOC_3_PAN <- sample(1:8,100,replace = T)
Q24_LOC_4_PAN <- sample(1:8,100,replace = T)

df1 <- as.data.table(data.frame(ID,region,Q21,Q22,Q24_LOC_1,Q24_LOC_2,Q24_LOC_3,Q24_LOC_4,Q21_PAN,Q22_PAN,Q24_LOC_1_PAN,Q24_LOC_2_PAN,Q24_LOC_3_PAN,Q24_LOC_4_PAN))

col_needed <- c("Q21","Q22","Q24_LOC_1","Q24_LOC_2","Q24_LOC_3","Q24_LOC_4")

check1 <- df1[,Q21_R := mean(Q21,na.rm = T)/mean(Q21_PAN,na.rm = T),by=region]

check1 适用于一个变量。我正在寻找一种解决方案,我可以在其中传递所有需要的变量并在一行中计算新变量。所以在这种情况下,类似于传递 col_needed。我也试过下面的代码 -

check2 <- df1[,`:=`(paste0(col_needed,"_R"),(mean(col_needed,na.rm = T)/mean(paste0(col_needed,"_PAN"),na.rm = T))),by=region][]

但是,这给了我多个警告,结果是所有 NA。警告是 - In mean(col_needed, na.rm = T) :参数不是数字或逻辑:返回 NA

你能告诉我哪里出错了。

【问题讨论】:

    标签: r data.table data-manipulation


    【解决方案1】:

    如果我理解正确,您可以执行以下操作:

    df1[, paste(col_needed, "R", sep = "_") := 
          Map(function(x,y) mean(get(x), na.rm = TRUE)/mean(get(y), na.rm=TRUE), 
               col_needed, 
               paste(col_needed, "PAN", sep = "_")),
        by=region]
    

    【讨论】:

    • 打败我。或者,可以使用.SD 而不需要get,但实际上是一样的。不建议更改,只是显示可能的超级小调整
    • @docendo,谢谢,这行得通。我理解通过 Map 我们能够将函数传递给每个元素 col_needed。
    • @MikeH.我在你删除之前也看过你的帖子。谢谢!!但是,我想与您确认 with = FALSE 与 Map 的用法。我不清楚为什么我们必须使用 with = FALSE。对不起,如果我问一些非常基本的问题....仍在学习 R 并试图弄清楚我的基础
    • @docendodiscimus 感谢您的确认!!
    • @user1412,我使用with = FALSE 按名称选择列。所以.SD[, col_needed, with = FALSE] 是我们想要的列中的data.table
    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    相关资源
    最近更新 更多