【问题标题】:Using plyr and generic functions to operate on each column of a data frame while preserving names使用 plyr 和泛型函数对数据框的每一列进行操作,同时保留名称
【发布时间】:2016-01-11 05:08:04
【问题描述】:

我正在尝试使用通用函数对数据框的每一列进行操作,其中操作将根据列的类而有所不同。

我无法让函数访问列的名称,同时也将列分派到正确的方法。

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?

【问题讨论】:

    标签: r plyr lapply


    【解决方案1】:

    我无法找到这个问题的直接解决方案,但是我确实找到了一个我相当满意的解决方法。我使用了一个中间函数,它接受a*ply 传递给它的列,并将unlisted 表单及其名称传递给通用函数。

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-13
      • 2013-12-23
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多