2016-05-14 3 views
0

Я пытаюсь найти среднее и медианное по категориям «a» и «b» под переменной y. Я пытаюсь написать функцию для этого вычисления. Это следующий пример набора данных:Пропустить имена столбцов в качестве аргументов функции - 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 

Один рабочий сценарий, который я нашел для 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 

Если вы знаете о любом другом методе od использовать имена столбцов в качестве функциональных параметров в R как для data.table, так и для data.frame, пожалуйста, поделитесь с объяснениями.

Спасибо.

+0

Вы можете проверить [здесь] (http://stackoverflow.com/questions/10178203/sending-in-column-name-to-ddply-from-function) – akrun

+2

Для 'data.table' вы также можете использовать 'f1 <- function (df, on_col, by_col) { df [,. (mean_value = mean (.SD [[1L]]), median_value = медиана (.SD [[1L]])), by = by_col, .SDcols = on_col] } 'Для' ddply' другая ссылка [здесь] (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 

Это не будет работать, если m и n не существует в глобальной среде.

Update: Это может иметь что-то делать с проблемой обзорного из 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") 

Обратите внимание, что номера строк выводятся по-разному версии subsetdata.table «s и базовой версии R, но в остальном они в значительной степени взаимозаменяемы (хотя data.table, конечно, гораздо быстрее).

+0

Благодарим вас за то, что вы поделились своими входами. Это действительно полезно. – skumar