簡體   English   中英

將列名作為函數參數傳遞-R

[英]Pass column names as function arguments - R

我試圖在y變量下找到類別“ a”和“ b”的均值和中位數。 我正在嘗試編寫一個函數來執行此計算。 以下是樣本數據集:

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

但是,類似的腳本不適用於ddply函數上的data.frame:

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

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

謝謝。

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

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 subsetdata.table版本和基本R版本而不同,但是否則它們幾乎可以互換(盡管data.table當然要快得多)。

看來這不是一個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軟件包的范圍問題有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM