2016-01-11 6 views
1

Я пытаюсь использовать общую функцию для работы с каждым столбцом фрейма данных, где операция будет варьироваться в зависимости от класса столбца ,Использование функций plyr и generic для работы с каждым столбцом кадра данных при сохранении имен

У меня возникли проблемы с предоставлением функции доступа к именам столбцов, а также отправкой столбцов в правильный метод.

df <- data.frame(f1 = factor(rep(1:3, 2))) 

myfun <- function(x){ 
    UseMethod("myfun", x) 
} 

myfun.factor <- function(x){ 
    print("Using factor method") 
    print(names(x)) 
    print(class(x)) 
} 

myfun.default <- function(x){ 
    print("Using default method") 
    print(names(x)) 
    print(class(x)) 
} 

Применение в виде списка дает правильную отправку, но раздевает имена из колонн

library(plyr) 
l_ply(df, myfun) 
[1] "Using factor method" 
NULL 
[1] "factor" 

ходатайствующих как массив сохраняет имена, но не дает правильные имена

a_ply(df, 2, myfun) 
[1] "Using default method" 
[1] "f1" 
[1] "data.frame" 

Есть ли опрятный способ получить максимум от обоих или am I stuck with the method described in the answer to this question?

ответ

0

Я не был чтобы найти прямое решение этого вопроса, однако я нашел работу вокруг, я довольно доволен. Я использовал промежуточную функцию, которая берет столбец, переданный ему a*ply, и передает форму unlist, и это имя для общей функции.

myfun2 <- function(x, x_name){ 
    UseMethod("myfun2", x) 
} 

myfun2.factor <- function(x, x_name){ 
    print("Using factor method") 
    print(x_name) 
    print(class(x)) 
    return(NULL) 
} 

myfun2.default <- function(x, x_name){ 
    print("Using default method") 
    print(x_name) 
    print(class(x)) 
    return(NULL) 
} 

dispatch_fun <- function(x){ 
    myfun2(unlist(x), names(x)) 
} 

a_ply(df, 2, dispatch_fun) 
## [1] "Using factor method" 
## [1] "f1" 
## [1] "factor"