我是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创建