gpt4 book ai didi

r - 将参数作为 (1) 字符串向量和 (2) 变量名提供给 data.table

转载 作者:行者123 更新时间:2023-12-04 11:26:26 24 4
gpt4 key购买 nike

想象一下,您想在 data.table 上按行应用一个函数。该函数的参数对应于固定的 data.table 列以及动态生成的列名。

有没有办法在使用 data.tables 时提供固定和动态列名作为函数的参数?

问题是:

  • 变量名和动态生成的字符串作为数据表上函数的参数
  • 动态列名字符串存储在具有 > 1 个条目的向量中(get() 不起作用)
  • 动态列的值需要作为向量提供给函数

  • 这说明了它:
    library('data.table')
    # Sample dataframe
    D <- data.table(id=1:3, fix=1:3, dyn1=1:3, dyn2=1:3) #fixed and dynamic column names
    setkey(D, id)
    # Sample function
    foo <-function(fix, dynvector){ rep(fix,length(dynvector)) %*% dynvector}
    # It does not matter what this function does.

    # The result when passing column names not dynamically
    D[, "new" := foo(fix,c(dyn1,dyn2)), by=id]
    # id fix dyn1 dyn2 new
    # 1: 1 1 1 1 2
    # 2: 2 2 2 2 8
    # 3: 3 3 3 3 18

    我想摆脱 c(dyn1,dyn2) .我需要从另一个将它们保存为字符串的向量中获取列名 dyn1、dyn2。

    这是我走了多远:
    # Now we try it dynamically
    cn <-paste("dyn",1:2,sep="") #vector holding column names "dyn1", "dyn2"

    # Approaches that don't work
    D[, "new" := foo(fix,c(cn)), by=id] #wrong as using a mere string
    D[, "new" := foo(fix,c(cn)), by=id, with=F] #does not work
    D[, "new" := foo(fix,c(get(cn))), by=id] #uses only the first element "dyn1"
    D[, "new" := foo(fix,c(mget(cn, .GlobalEnv, inherits=T))), by=id] #does not work
    D[, "new" := foo(fix,c(.SD)), by=id, .SDcols=cn] #does not work

    我想 mget()是解决方案,但我对范围界定知之甚少,无法弄清楚。

    谢谢!金宝洁

    更新:解决方案

    基于 BondedDust 的回答
        D[, "new" := foo(fix,sapply(cn, function(x) {get(x)})), by=id]

    最佳答案

    我无法弄清楚您试图用矩阵乘法做什么,但这显示了如何创建具有可变和固定输入的新变量到函数:

    D <- data.table(id=1:3, fix=1:3, dyn1=1:3, dyn2=1:3) 
    setkey(id)

    foo <-function(fix, dynvector){ fix* dynvector}
    D[, paste("new",1:2,sep="_") := lapply( c(dyn1,dyn2), foo, fix=fix), by=id]
    #----------
    > D
    id fix dyn1 dyn2 new_1 new_2
    1: 1 1 1 1 1 1
    2: 2 2 2 2 4 4
    3: 3 3 3 3 9 9

    所以你需要使用字符值向量到 get列。这是这个问题的一个扩展: Why do I need to wrap `get` in a dummy function within a J `lapply` call?
    > D <- data.table(id=1:3, fix=1:3, dyn1=1:3, dyn2=1:3) 
    > setkey(D, id)
    > id1 <- parse(text=cn)
    > foo <-function( fix, dynvector){ fix*dynvector}
    > D[, paste("new",1:2,sep="_") := lapply( sapply( cn, function(x) {get(x)}) , foo, fix=fix) ]
    Warning message:
    In `[.data.table`(D, , `:=`(paste("new", 1:2, sep = "_"), lapply(sapply(cn, :
    Supplied 2 columns to be assigned a list (length 6) of values (4 unused)
    > D
    id fix dyn1 dyn2 new_1 new_2
    1: 1 1 1 1 1 2
    2: 2 2 2 2 2 4
    3: 3 3 3 3 3 6

    您可能可以使用 create an expression from a function for data.table to eval 中的方法以及。

    关于r - 将参数作为 (1) 字符串向量和 (2) 变量名提供给 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23584346/

    24 4 0