使用 plyr 和通用函数对数据框的每一列进行操作,同时保留名称
Using plyr and generic functions to operate on each column of a data frame while preserving names
我正在尝试使用通用函数对数据框的每一列进行操作,其中操作将根据列的 class 而有所不同。
我在向函数提供对列名称的访问权限的同时,也无法将列分派给正确的方法。
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?
我无法找到这个问题的直接解决方案,但我确实找到了一个我相当满意的解决方案。我使用了一个中间函数,该函数接受 a*ply
传递给它的列,并将 unlist
ed 形式及其名称传递给通用函数。
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"
我正在尝试使用通用函数对数据框的每一列进行操作,其中操作将根据列的 class 而有所不同。
我在向函数提供对列名称的访问权限的同时,也无法将列分派给正确的方法。
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?
我无法找到这个问题的直接解决方案,但我确实找到了一个我相当满意的解决方案。我使用了一个中间函数,该函数接受 a*ply
传递给它的列,并将 unlist
ed 形式及其名称传递给通用函数。
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"