gpt4 book ai didi

r - 使用 data.table 计算新列

转载 作者:行者123 更新时间:2023-12-01 08:53:52 25 4
gpt4 key购买 nike

我有以下数据

set.seed(5)
dt <- data.table(ID=letters, x = rnorm(26), y = rnorm(26), z = c(rep(15, 13), rep(20,13)))

返回,

    ID           x           y  z
1: a -0.84085548 1.41858907 15
2: b 1.38435934 1.49877383 15
3: c -1.25549186 -0.65708209 15
4: d 0.07014277 -0.85279544 15
5: e 1.71144087 0.31591504 15
6: f -0.60290798 1.10969417 15
7: g -0.47216639 2.21546057 15
8: h -0.63537131 1.21710364 15
9: i -0.28577363 1.47922179 15
10: j 0.13810822 0.95157383 15
11: k 1.22763034 -1.00953265 15
12: l -0.80177945 -2.00047274 15
13: m -1.08039260 -1.76218587 15
14: n -0.15753436 -0.14260813 20
15: o -1.07176004 1.55006037 20
16: p -0.13898614 -0.80242318 20
17: q -0.59731309 -0.07457892 20
18: r -2.18396676 1.89566795 20
19: s 0.24081726 -0.45656894 20
20: t -0.25935541 0.56222336 20
21: u 0.90051195 -0.88700851 20
22: v 0.94186939 -0.46024458 20
23: w 1.46796190 -0.72432849 20
24: x 0.70676109 -0.06921116 20
25: y 0.81900893 1.46324856 20
26: z -0.29348185 0.18772610 20

我正在尝试通过将列 xyz 分开来更新列,同时保留列 标识。也就是说,最终输出应包含列 IDx/zy/z

我尝试了以下代码,但它返回了错误

dt[,c('x', 'y'):=lapply(.SD, function(x) x/z), .SDcols = names(dt)]

仅供引用,实际数据中有超过 100 列必须除以列 z

你能给我一些建议吗?

最佳答案

更新: 问题 #495现在用 this recent commit 解决了,我们现在可以很好地做到这一点:

require(data.table) # v1.9.7+
nam <- setdiff(names(dt), c("ID", "z"))
dt[, (nam) := lapply(.SD, `/`, z), .SDcols = nam]

nam <- setdiff(names(dt), c("ID", "z"))    
dt[, (nam) := lapply(.SD, `/`, dt[,z]), .SDcols = nam]

请注意,由于这个 data.table 错误 #495,我在 lapply 中使用了 dt[, z] .
如果您使用 .SDcols,则不能在函数调用中使用其他列。

作为一种解决方法,在 #495 完成之前,您可以使用 mget(),如下所示:

dt[, (nam) := lapply(mget(nam), `/`, z)]

关于r - 使用 data.table 计算新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32944060/

25 4 0