【问题标题】:How to loop in data.table?如何在data.table中循环?
【发布时间】:2020-12-03 03:38:24
【问题描述】:

我是 R 新手,想知道是否有人可以提供帮助?我有 200 多列和一个加权列,所以我需要将每一列乘以其相关的权重来创建新的加权列,以便我可以进一步分析数据。每列都有多个级别,所以我的性别有 2(男性,女性例子)。如何遍历所有列以创建新变量,就像我在下面为一列所做的那样?

DF[,gender_w:=gender*weight/gender]
    

DF[,lapply(.SD,sum, na.rm=T),by= gender, .SDcols=c(all_weighted_column_names)]

提前感谢您的任何建议。

编辑-更多信息

    DF <- (Gender = c(1,2,2,1,2),
Age_group = c(1,5,5,4,3)
Question1 = c(1,0,0,1,1)
Question2 = c(0,1,0,1,1)
Weight = c(2,5,3,1,5))

我必须发布虚拟变量,但希望这会帮助您了解图片。

在这个例子中,我需要每个变量中每个组的总和,但我需要先对它们进行加权。所以对于性别,如果 1 = M 和 2 = F 那么我不需要 2 个男性和 3 个女性,但我需要将它们乘以相应的权重,然后将它们相加。所以我需要它来显示 3 个男性和 13 个女性。

In the age_group, instead of Age_group_1 = 1, Age_group_3 = 1, Age_group_4 = 1 and Age_group_5 = 2. I need to produce Age_group_1 = 2, Age_group_3 = 5, Age_group_4 = 1 and Age_group_5 = 8

有没有办法做到这一点并遍历所有列?我总共有 +200,但我想不出一个有效的方法来做到这一点。

再次感谢您的帮助。

【问题讨论】:

  • 如果你用 2 列数据和一个权重变量以及只有几行来制作一个虚拟示例,那将是最好的。然后你可以通过dput()分享它。
  • 您可能应该将 data.table 融化为长格式。如果您需要宽格式,您可以稍后进行 dcast。
  • 您的问题令人困惑。也许你正在寻找这个:DF[, paste0(head(names(DF), -1), "_w") := lapply(.SD, function(x) x * Weight), .SDcols = head(names(DF), -1)]

标签: r loops data.table lapply levels


【解决方案1】:

您可以计算组件明智的产品。 所以假设你有一个 data.table

dt <- data.table(
  x = 1:10,
  y = 11:20,
  weight = 2
)

您现在可以使用

来衡量 x 和 y 列的重量
dt[, c("x", "y")] <- dt[, c("x", "y")] * dt[, "weight"]

如果每列都有一个唯一的权重向量,这也可以。 请注意,这不是 data.table 语法,但它保留了 dt 的 data.table 结构。

【讨论】:

  • 运行您的示例会产生此错误:Ops.data.frame(dt[, c("x", "y")], dt[, "weight"]) 中的错误:'*'只为同样大小的数据框定义
  • 尝试dt &lt;- as.matrix(dt),稍后再将其重新转换为data.table。
猜你喜欢
  • 2017-07-11
  • 2019-11-26
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2017-04-08
  • 2021-06-25
  • 2023-04-02
相关资源
最近更新 更多