将列名作为函数参数传递 - 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)
我尝试了以下方法,但我无法找到任何 elegant/simple 方法将列名作为函数参数传递给 data.table 和 data.frame.
data.tablesample_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 on 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
我为 data.frame 使用 ddply 函数找到的一个工作脚本是:
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
版本的 subset
和基础 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
如果 m
和 n
在全局环境中不存在,这将不起作用。
更新:
它可能与提到的 plyr
包的 范围问题 有关 here.
我正在尝试在 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)
我尝试了以下方法,但我无法找到任何 elegant/simple 方法将列名作为函数参数传递给 data.table 和 data.frame.
data.tablesample_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 on 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
我为 data.frame 使用 ddply 函数找到的一个工作脚本是:
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
版本的 subset
和基础 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
如果 m
和 n
在全局环境中不存在,这将不起作用。
更新:
它可能与提到的 plyr
包的 范围问题 有关 here.