当返回具有可变数量的列

时间:2016-01-29 05:20:10

标签: r plyr apply

我想知道当函数的返回可以有多少列可变时,是否有办法从applyplyr调用直接返回数据帧(但总会有相同的行数)。例如:

df <- data.frame(A = 1:3, B = c("a","b", "c"))

my_fun <- function(x){
  if(is.numeric(unlist(x))){
    return(x)
  } else {
    return(cbind(x, x))
  }
}

我能够得到的最接近的是返回一个列表并将其转换为数据框:

library(plyr)
data.frame(alply(df, 2, my_fun))
##   A X2.B X2.B.1
## 1 1    a      a
## 2 2    b      b
## 3 3    c      c

感觉就像有一种方法可以在没有额外转换的情况下做到这一点,是吗?

1 个答案:

答案 0 :(得分:4)

当您想要将函数应用于数据框的多个列时,我会以这种方式使用lapply()。在基数R中,您可以将数据框视为列表,其中每列是一个元素。如果您像往常一样使用lapply(),它将返回一个列表,这不是我们想要的。

> lapply(df, my_fun)
$A
[1] 1 2 3

$B
     x x
[1,] 1 1
[2,] 2 2
[3,] 3 3

但如果将结果分配给df[],它将向R发信号通知您想要原始数据帧的子集(完整子集,根本不是子集),从而保留数据框架对象类型。

> df[] <- lapply(df, my_fun)
> df
  A B.x B.x
1 1   1   1
2 2   2   2
3 3   3   3