R 将函数应用于数据库的每一列
我使用的是一个特殊的小生境函数,它要求将列的变量名作为对象名进行分析。我想在许多列上循环此函数,但我不知道如何将列名解析为对象名,以使函数正常工作 以下是一个例子:R 将函数应用于数据库的每一列,r,R,我使用的是一个特殊的小生境函数,它要求将列的变量名作为对象名进行分析。我想在许多列上循环此函数,但我不知道如何将列名解析为对象名,以使函数正常工作 以下是一个例子: library(caper) library(ape) tree = rtree(100) data = data.frame(taxa = tree$tip.label, value1 = sample(c(0,1), 100, replace = TRUE),
library(caper)
library(ape)
tree = rtree(100)
data = data.frame(taxa = tree$tip.label,
value1 = sample(c(0,1), 100, replace = TRUE),
value2 = sample(c(0,1), 100, replace = TRUE))
for(i in 2:3){
phylo.d(data = data, phy = tree,
names.col = taxa,
binvar = eval(substitute(colnames(data)[i]))
)
}
我遇到的问题是binvar参数。我目前在那里的代码不起作用,但这是我最好的猜测。这将返回以下错误:
phylo.d(data=data,phy=tree,names.col=taxa,binvar=eval(替换)(colnames(data)[i]))中的错误:'eval(替换(colnames(data)[i])不是数据中的变量。
从上面的参数names.col
可以看出函数希望如何输入列名(如对象名)。然后,该函数使用deparse(substitute(binvar))
从数据帧中提取列
有人能提出解决办法吗?(除了重新编写函数) 我的方法是在传递到
evaluate
之前为整个函数调用构建一个字符串。在这种情况下,循环的迭代将产生:
str="phylo.d(data=data,phy=tree,names.col=taxa,binvar=value1)"
str="phylo.d(data=data,phy=tree,names.col=taxa,binvar=value2)"
然后使用print(eval(str2expression(str)))
对每个参数进行求值。我使用print是因为phylo.d
似乎会产生不可见的输出
如果要保存对phylo.d
的调用输出,则在上面的字符串中构建赋值,并删除print
语句
如果您对rlang
包和准旋转感到满意,您可能可以构建一个更整洁的解决方案
以下是我的整个解决方案:
build.expr=function(i) {
paste("phylo.d(data=data,phy=tree,names.col=taxa,binvar=",
colnames(data) [i],")",sep='')
}
for (i in 2:3) {
print( eval(str2expression(build.expr(i))))
}
仅供参考:这是我的会议信息,因为你问了
> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 19.10
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.3.7.so
locale:
[1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
[4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
[7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.6.1 tools_3.6.1
当我键入?str2表达式时,它会显示一个基本R的包。这就是为什么不使用非标准求值规则编写函数的原因。我指的是<代码> PyLo.D./Cord>的作者,而不是你。如果我的解决方案是可用的,你会考虑把它作为解决方案吗?道歉,因为我的回答是在度假。这似乎是一个很好的选择,但不幸的是我找不到你的答案,因为我找不到你提到的str2表达式函数。这是从什么包来的?将最后一行代码更改为打印(eval(parse(text=build.expr(i)))对我来说很有趣-它似乎在我的基本R中,但既然你让它工作起来了…我正在运行R3.5.3,这是我在我们的会话之间看到的唯一明显区别。那么我猜就是这样了耸耸肩:虽然在Mac上也是如此(但如果我认为这就是区别的话,那就太奇怪了)