【问题标题】:R data.table apply function to rows using columns as arguments which returns a vector (i.e. multiple values)R data.table 使用列作为参数将函数应用于行,该参数返回一个向量(即多个值)
【发布时间】:2019-10-25 21:31:51
【问题描述】:

假设我有以下 data.table-

library(data.table)
x = structure(list(f1 = 1:3, f2 = 3:5), .Names = c("f1", "f2"), row.names = c(NA, -3L), class = c("data.table", "data.frame"))

现在我想在每一行上应用下面的函数-

func.text <- function(arg1,arg2){ return(c(10, arg1 + exp(arg2)))}

这样,我看到下面的结果-

> x[, func.text(f1, f2), by = seq_len(nrow(x))]
   seq_len        V1
1:       1  10.00000
2:       1  21.08554
3:       2  10.00000
4:       2  56.59815
5:       3  10.00000
6:       3 151.41316

但是,我想在最终结果中获得 2 个额外的列,因为此函数返回 2 个值,与原始 data.table 的行数相同。

有什么办法吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    对您最初的想法的最小更改:

    • 让函数返回一个列表并
    • := 分配结果

    func.text <- function(arg1,arg2){ return(list(10, arg1 + exp(arg2)))}
    x[, c("var1", "var2") := func.text(f1, f2), by = seq_len(nrow(x))]
    x
    
       f1 f2      var2 var1
    1:  1  3  21.08554   10
    2:  2  4  56.59815   10
    3:  3  5 151.41316   10
    

    【讨论】:

    • 感谢您的精彩回复。还有一个问题。假设 data.table 的所有列都是数字,假设我们可以将整行作为向量传递,而不是将参数作为 data.table 的列的名称传递。我的原始 data.table 的列名是可变的,因此不断变化。所以我试图避免传递列名
    • @Bogaso 是的,您可以轻松做到这一点。
    猜你喜欢
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多