如何将内置函数名存储在Vector中,并通过R中的循环进行解析



我是R的新手,需要一些帮助。

我想通过For循环为数据帧df中的每一列计算平均值、中值等。这些函数被存储在向量CCD_ 2中。我无法转换存储在向量my_func中的变量来执行预期的函数。我将统计数据添加到数据帧的底部:

my_func=c("mean", "median", "stats::sd", "max", "min")
for (func in my_func){
new_row <- c()
for (i in names(df)){
y <- func(df[ ,i], na.rm=F)
new_row <- c(new_row, y)
}
df[nrow(df)+ 1, ] = c(new_row[1:11])
rownames(df)[nrow(df)] <- j
}

您可以将函数存储在不带引号的向量中:

my_func <- c(mean, median, stats::sd, max, min)

那么它应该会起作用。请注意,my_func将变成一个列表。

按照@KarolisKoncevicius的建议存储函数可能是最好的解决方案,但另一种方法是在调用函数之前按名称检索函数。由于其中一个函数是由表达式stats::sd定义的,而不仅仅是名称,因此应该解析该表达式并使用eval()来获取函数。

您的示例代码还存在其他几个问题:它引用j而没有定义它,并且假设new_row中有11个条目,而可能有任何数字。这段代码修复了这两个问题,并显示了解析和评估解决方案:

df <- data.frame(x = 1:10, y = rnorm(10))
my_func=c("mean", "median", "stats::sd", "max", "min")
for (func in my_func){
new_row <- c()
f <- eval(parse(text=func))
for (i in names(df)){
y <- f(df[ ,i], na.rm=F)
new_row <- c(new_row, y)
}
df[nrow(df)+ 1, ] <- new_row
rownames(df)[nrow(df)] <- func
}
df
#>                   x           y
#> 1          1.000000 -2.27557495
#> 2          2.000000 -0.31151886
#> 3          3.000000 -0.87811049
#> 4          4.000000 -1.69935663
#> 5          5.000000  0.76985473
#> 6          6.000000 -0.70577880
#> 7          7.000000  1.46104332
#> 8          8.000000  1.34460671
#> 9          9.000000 -0.51577892
#> 10        10.000000  0.02118427
#> mean       5.500000 -0.27894296
#> median     5.500000 -0.31151886
#> stats::sd  2.738613  1.10605560
#> max       10.000000  1.46104332
#> min        1.000000 -2.27557495

由reprex包(v0.3.0(于2021-01-10创建

相关内容

最新更新