当 return 的列数可变时使用 apply 或 plyr
Using the apply or plyr when the return has a variable number of columns
我想知道当函数中的 return 可以有时,是否有办法直接从 apply
或 plyr
调用 return 数据框可变数量的列(但将始终具有相同的行数)。例如:
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))
}
}
我能得到的最接近的是 return 列表并将其转换为数据框:
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()
。在 base R 中,您可以将数据框视为列表,其中每一列都是一个元素。如果您像往常一样使用 lapply() 它将 return 一个列表,这不是我们想要的。
> 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
我想知道当函数中的 return 可以有时,是否有办法直接从 apply
或 plyr
调用 return 数据框可变数量的列(但将始终具有相同的行数)。例如:
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))
}
}
我能得到的最接近的是 return 列表并将其转换为数据框:
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()
。在 base R 中,您可以将数据框视为列表,其中每一列都是一个元素。如果您像往常一样使用 lapply() 它将 return 一个列表,这不是我们想要的。
> 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