Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将参数作为(1)字符串向量和(2)变量名称提供给data.table_R_Data.table - Fatal编程技术网

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

R 将参数作为(1)字符串向量和(2)变量名称提供给data.table,r,data.table,R,Data.table,假设您希望在data.table上按行应用函数。函数的参数对应于固定的data.table列以及动态生成的列名 在使用data.tables时,是否有方法将固定和动态列名作为参数提供给函数 问题是: 变量名称和动态生成的字符串都是datatable上函数的参数 动态列名字符串存储在一个大于1个条目的向量中(get()不起作用) 动态列的值需要作为向量提供给函数 这说明: library('data.table') # Sample dataframe D <- data.table(i

假设您希望在data.table上按行应用函数。函数的参数对应于固定的data.table列以及动态生成的列名

在使用data.tables时,是否有方法将固定和动态列名作为参数提供给函数

问题是:

  • 变量名称和动态生成的字符串都是datatable上函数的参数
  • 动态列名字符串存储在一个大于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
我想,
mget()
是解决方案,但我对范围界定知之甚少,无法解决这个问题

谢谢!JBJ


更新:解决方案

根据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

您也可以使用中的方法。

您好,谢谢您的努力,但这并不能回答我的问题。函数
foo(fix,dyinvector)
不相关,仅用于说明问题。(我想用这个函数做的事情要复杂得多)。主要的问题是一个有两个参数的函数,一个是向量,这个向量需要从data.table中的多个变量动态创建。此函数的输出是标量。您的解决方案使用列的名称(dyn1,dyn2)作为输入,而不是将列的名称作为字符串()保存的向量。啊,包装解决了这个问题。答案并不是100%,而是紧紧基于它。关于接受你的回答,我该怎么做?我现在是否也接受你的答案作为解决方案?这取决于你。显然,你应该投票认为它有用,但如果有更好的答案,你可以发布它并勾选你自己的答案。顺便说一句,你对设置键的调用会出错。这是否回答了你的问题?
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
> 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