2015-10-05 53 views
3

,我有以下数据使用data.table计算新列

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 

我将尝试都与z将更新列xy,在同一时间,保留列ID。也就是说,最终的输出应包含列IDx/z,并y/z

我尝试下面的代码,但它返回我的错误

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

仅供参考,有超过100列在实际数据必须除以列z

您能否给我建议?

回答

5

更新:问题#495this 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] 

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

作为一种变通方法,直到#495完成后,您可以使用mget()如下:

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

这不工作?

dt$x <- dt$x/dt$z 
dt$y <- dt$y/dt$z 

dt <- dt[ , seq(1, 3)] 

编辑:如果你有你有Z到分多列,可以改为尝试这个办法:

dt[, seq(2, 101)] <- sapply(dt[, seq(2, 101)], '/', dt$z) 
dt <- dt[, seq(1, 101)] #replace with boundaries of your choosing 
3

如何

dt[, `:=`(x=x/z, y=y/z, z=NULL)] 

编辑:添加后到原来的问题,有超过数据表中的两列我会与Floo0的回答