gpt4 book ai didi

r - 在不使用 apply 的情况下从 data.table 行创建向量

转载 作者:行者123 更新时间:2023-12-01 13:21:29 24 4
gpt4 key购买 nike

假设我想在 data.table 中创建一列,其中每行中的值等于同一行中其他三个单元格中值的标准差。例如,如果我做

DT <- data.table(a = 1:4, b = c(5, 7, 9, 11), c = c(13, 16, 19, 22), d = c(25, 29, 33, 37))
DT
a b c d
1: 1 5 13 25
2: 2 7 16 29
3: 3 9 19 33
4: 4 11 22 37

我想添加一列,其中包含每一行的 a、b 和 d 的标准差,如下所示:

   a  b  c  d abdSD
1: 1 5 13 23 12.86
2: 2 7 16 27 14.36
3: 3 9 19 31 15.87
4: 4 11 22 35 17.39

我当然可以编写一个 for 循环或使用一个应用函数来计算它。不幸的是,我真正想做的事情需要应用于数百万行,而不是像计算标准偏差那样简单的函数,并且需要在几分之一秒内完成,所以我真的需要一个矢量化解决方案。我想写类似的东西

DT[, abdSD := sd(c(a, b, d))]

但不幸的是,这并没有给出正确的答案。是否有任何 data.table 语法可以从同一行中的不同值创建一个向量,并使该向量可用于填充该行中新单元格的函数?任何帮助将不胜感激。 @阿伦

最佳答案

根据您的数据大小,您可能希望将数据转换为长格式,然后按如下方式计算结果:

complexFunc <- function(x) sd(x)

cols <- c("a", "b", "d")
rowres <- melt(DT[, rn:=.I], id.vars="rn", variable.factor=FALSE)[,
list(abdRes=complexFunc(value[variable %chin% cols])), by=.(rn)]
DT[rowres, on=.(rn)]

或者如果你的复杂函数有 3 个参数,你可以做类似的事情

DT[, abdSD := mapply(complexFunc, a, b, d)]

关于r - 在不使用 apply 的情况下从 data.table 行创建向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49641065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com