我在R中有一个大的data.table,其中有几列带有美元值 . 在另一栏中,我有一个通胀调整数字 . 我试图找出如何用它乘以通胀调整列来更新我的每个货币列 . 假设我有数据:
DT <- data.table(id=1:1000,year=round(runif(1000)*10),
inc1 = runif(1000), inc2 = runif(1000), inc3 = runif(1000),
deflator = rnorm(1000))
给出输出:
id year inc1 inc2 inc3 deflator
1: 1 8 0.4754808 0.6678110 0.41533976 -0.64126988
2: 2 2 0.6568746 0.7765634 0.70616373 0.39687915
3: 3 6 0.8192947 0.9236281 0.90002534 -0.69545700
4: 4 4 0.7781929 0.1624902 0.17565790 0.05263055
5: 5 7 0.6232520 0.8024975 0.86449836 0.70781887
---
996: 996 2 0.9676383 0.2238746 0.19822000 0.78564836
997: 997 9 0.9877410 0.5783748 0.57497438 -1.63365223
998: 998 8 0.2220570 0.6500632 0.19814932 1.00260174
999: 999 3 0.4793767 0.2830457 0.54835581 1.04168818
1000: 1000 8 0.2003476 0.6121637 0.02921505 0.34933690
实际上我有 inc1
- inc100
,而不仅仅是三个变量,我想找出一种方法来执行此操作:
DT[, inc1 := inc1 * deflator]
对于我的100个收入列中的每一列(上面的假数据中的inc1,inc2,inc3) . 我将来会有超过100个列,所以我想找到一种方法来循环操作列 . 有没有办法一次性为所有收入栏做这个?
我想做的事情如下:
inc_cols = c(inc1, inc2, inc3)
DT[, inc_cols := lapply(inc_cols,function(x)= x * deflator),]
要么
DT[, inc_cols := lapply(.SD,function(x)= x * deflator),.SDcols = inc_cols]
但这些似乎都不起作用 . 我也尝试使用 get()
函数使其清楚 deflator
是一个引用列,如:
DT[, inc_cols := lapply(.SD,function(x)= x * get(deflator)),.SDcols = inc_cols]
但没有运气 . 我还尝试用以下内容循环变量:
for (var in inc_cols) {
print(var)
DT[, get(var) := get(var) *infAdj2010_mult]
}
返回
[1] "inc1"
Error in get(var) : object 'inc1' not found
我意识到这可能是一个直截了当的问题,我试图在这里搜索其他问题和各种在线指南和教程,但我找不到匹配我的具体问题的例子 . 它类似于question,但并不完全相同 .
谢谢你的帮助!
3 回答
你可以试试
或者如果你需要一个循环
或者使用
set
的可能选项,应该非常快,因为避免了[.data.table
的开销(由@Arun建议)哪里
数据
既然你可以在data.tables上使用dplyr,你也可以这样做:
这将乘以“deflator”列的“inc”开头的每列DT .
这种方法也很方便,但可能比使用
set()
慢: