2016-05-14 69 views
0

我正在尝试查找y变量下类别“a”和“b”的平均值和中值。我想写一个函数来做这个计算。这是下面的示例数据集:将列名作为函数参数传递 - R

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

一个工作脚本是:

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 

然而,类似的脚本不适合data.frame上工作ddply功能:

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是:

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 

如果你知道任何其他方法od对于data.table和data.frame在R中使用列名作为函数参数,请分享解释。

谢谢。

+0

您可以选择[这里](http://stackoverflow.com/questions/10178203/sending-in-column-name-to-ddply-from-function) – akrun

+2

对于'data.table',你也可以使用(mean_value = mean(.SD [[1L]]),median_value = median(.SD [[1L]])),by = by_col, .SDcols = on_col] }'对于'ddply'另一个链接是[here](http://stackoverflow.com/questions/6584030/using-ddply-inside-a-function) – akrun

+1

@akrun - 非常感谢你分享这个输入。这真的很有帮助。 – skumar

回答

0

它似乎并不像是一个ddply问题,但与功能环境有关。我在这里做了一些测试,如果你在全局环境中定义变量,ddply可以接受并得到结果,但是当你将字符串作为变量传递给函数时会发生一些好奇。

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封装的提到here

+0

感谢您的回复。这非常有用。 – skumar

0

您可以参考的列名如下:对于这两种类型的

sample_data[["y"]] 
sample_data_dt[["y"]] 

其工作方式类似于(尽管不是相同)的另一个命令是subset,例如

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") 

注意,行数都是不同的输出通过data.table的版本subset和基础R版本,但否则他们是非常互换(虽然data.table当然是更快)。

+0

感谢您分享您的输入。这真的很有帮助。 – skumar