r - 将函数应用于多个列

标签 r data.table lapply

我正在尝试使用查找表中的值来乘以主表中的相应值。

这是一些数据的示例

查找

lu = structure(list(year = 0:12, val = c(1.6422, 1.6087, 1.5909, 1.4456, 
1.4739, 1.4629, 1.467, 1.4619, 1.2588, 1.1233, 1.1664, 1.1527, 
1.2337)), .Names = c("year", "val"), class = "data.frame", row.names = c(NA, 
-13L))

主要数据

dt = structure(list(year = c(3L, 4L, 6L, 10L, 3L, 9L, 10L, 7L, 7L, 
1L), x = 1:10, y = 1:10), .Names = c("year", "x", "y"), row.names = c(NA, 
-10L), class = c("data.table", "data.frame"))

我可以通过合并然后一次乘以一列来产生我想要的结果

library(data.table) 

dt = merge(dt, lu, by = "year")
dt[, xnew := x*val][, ynew := y*val]

但是,我有很多变量可以应用它。对此有很多疑问,但我无法让它发挥作用。

使用 How to apply same function to every specified column in a data.tableR Datatable, apply a function to a subset of columns 的想法,我尝试过

dt[, (c("xnew", "ynew")):=lapply(.SD, function(i) i* val), .SDcols=c("x", "y")]

Error in FUN(X[[i]], ...) : object 'val' not found

for (j in c("x", "y")) set(dt, j = j, value = val* dat[[j]])

Error in set(dt, j = j, value = val * dt[[j]]) : object 'val' not found

并且仅尝试不分配(来自 Data table - apply the same function on several columns to create new data table columns )的乘法也不起作用。

dt[, lapply(.SD, function(i) i* val), .SDcols=c("x", "y")]

Error in FUN(X[[i]], ...) : object 'val' not found

请您指出我的错误。谢谢。

我正在使用 data.table 版本 v1.9.6。

最佳答案

我们可以尝试通过加入,然后指定 .SDcols

dt[lu, on = .(year), nomatch =0 
    ][, c("x_new", "y_new") := lapply(.SD, `*`, val), .SDcols = x:y][]

关于r - 将函数应用于多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42750264/

相关文章:

r - 用最后一个非 NA 值加上另一个向量中的值以滚动方式填充向量中的 NA 值

R语言-提取两个分隔符之间的字符串

r - 以 a-z 有序方式对数据进行子集化

Python 或 R 的可读性

r - txtProgressBar 突然停止使用 style=3

r - 从非序列表计算经过的天数

r - 计算R中每分钟的平均值

r - 将 data.frames 列表的列表转换为 R 中的单个 data.frame

r - 将一列列表除以另一列中的数字

r - 聚合随机采样的列以迭代更大的 bin 大小