r - 当返回的列数可变时使用 apply 或 plyr

标签 r plyr apply

我想知道是否有办法直接从 apply 返回数据帧或 plyr当函数返回的列数可变(但行数始终相同)时调用。例如:

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

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

最佳答案

我用 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

关于r - 当返回的列数可变时使用 apply 或 plyr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35077420/

相关文章:

r - 通过 id 变量计算滚动总和,缺少时间点

R 返回每行最小列的索引

r - 如何获得应用功能产生副作用?

r - 如何从 Google 表单调查复选框网格问题中绘制多个分类变量并在 R 中进行最佳可视化?

r 如何使用这些约束重新调整一系列数字?

r - 使用 plyr::mutate 以矢量化方式提取列表部分?

r - 当有更多元素循环/应用时,为什么峰值内存使用量会增加?

r - 如何阅读 .xpt 文件?

r - 航类数据集的 KNN 错误

r - 当某些条件适用时允许最大条目数