关于数据框:将列名作为函数参数传递-R

Pass column names as function arguments - R

我试图在y变量下找到类别" a"和" b"的均值和中位数。 我正在尝试编写一个函数来执行此计算。 以下是样本数据集:

1
2
3
sample_data <- data.frame(x = 1:10, y = c("a","b"))
library(data.table)
sample_data_dt <- as.data.table(sample_data)

我尝试了以下方法,但找不到任何优雅/简单的方法来将列名称作为data.table和data.frame中的函数参数传递。

data.table sample_data_dt的一种工作脚本是:

1
2
3
apply_statistics_4 <- function(df, on_col, by_col){
df[, list(mean_value = mean(get(on_col)), median_value = median(get(on_col))), by = get(by_col)]}
apply_statistics_4(sample_data_dt,"x","y") #works

但是,类似的脚本不适用于ddply函数上的data.frame:

1
2
3
4
apply_statistics_5 <- function(df, on_col, by_col){
ddply(df,.(get(by_col)), summarize, mean1 = mean(get(on_col)), median1 = median(get(on_col)))}
apply_statistics_5(sample_data,"x","y") #Does not work
#  Error in get(by_col) : object 'y' not found

我使用ddply函数为data.frame找到的一个工作脚本是:

1
2
3
4
5
apply_statistics <- function(df, on_col, by_col){
df$y1 <- eval(substitute(by_col), df)
df$x1 <- eval(substitute(on_col), df)
ddply(df,.(y1), summarize, mean1 = mean(x1), median1 = median(x1))}
d <- apply_statistics(sample_data, x, y) #Works

如果您知道将R.中的列名用作data.table和data.frame的任何其他方法,请共享说明。

谢谢。


看来这不是一个ddply问题,但与功能环境有关。 我在这里进行了一些测试,如果您在全局环境中定义变量,则ddply可以接受并获取结果,但是当您将字符串作为变量传递给函数时,会发生一些奇怪的事情。

1
2
3
4
5
6
7
8
9
m <-"x"
n <-"y"
apply_statistics_5 <- function(df, m, n){
    ddply(df, n, summarise, mean1 = mean(get(m)), median1 = median(get(m)))
}
apply_statistics_5(sample_data,"x","y")
  y mean1 median1
1 a     5       5
2 b     6       6

如果mn在全局环境中不存在,则将无法使用。

更新:
它可能与此处提到的plyr包的范围问题有关。


您可以按以下方式引用列名:

1
2
sample_data[["y"]]
sample_data_dt[["y"]]

对于两种类型,另一个类似(尽管不完全相同)的命令是subset,例如

1
2
3
4
5
6
on_col <-"x"
subset(sample_data, select=get(on_col))
subset(sample_data_dt, select=get(on_col))
by_col <-"y"
subset(sample_data, subset=get(by_col)=="a")
subset(sample_data_dt, subset=get(by_col)=="a")

请注意,行号在subsetdata.table版本和基本R版本中输出不同,但是否则它们几乎可以互换(尽管data.table当然要快得多)。