2016-05-14 42 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