gpt4 book ai didi

r - 使用 data.table 将 R 中的许多列乘以特定的其他列?

转载 作者:行者123 更新时间:2023-12-02 03:27:58 25 4
gpt4 key购买 nike

我在 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 ,但不完全是。

感谢您的帮助!

最佳答案

由于您可以在 data.tables 上使用 dplyr,因此您也可以执行以下操作:

library(dplyr)
DT %>% mutate_each(funs(.*deflator), starts_with("inc"))

这会将 DT 中以“inc”开头的每一列乘以“deflator”列。

关于r - 使用 data.table 将 R 中的许多列乘以特定的其他列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28123098/

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