我有一个数据框,我想使用自定义函数向该数据框添加多个新列。这些新列将是现有列的某些功能,但它们需要使用自定义功能。
我目前正在尝试让我的自定义函数将结果返回到列表中,然后我将其解析为单独的列。这有时通过返回列表向量来工作,但有时会返回一个矩阵,在这种情况下我会得到一个像
这样的错误
$<-.data.frame
中的错误(*tmp*
,“z”,值=列表(1,2,3,3,4)):替换有2行,数据有3
以下是我想要做的一些示例。
sample_func <- function(number)
{
list(w = number + 1, u = number + 2)
}
data = data.frame(x = c(1,2,3), y= c(5,6,7))
data$z = sapply(c(1,2,3),sample_func)
data$w = sapply(data$z,"[[","w")
data$u = sapply(data$z,"[[","u")
答案 0 :(得分:2)
函数sapply
自动简化结果。在这种情况下,您将获得一个矩阵。您可以使用参数simplify = FALSE
来避免此行为。但是使用lapply
会更容易,因为此函数不会尝试简化结果。
命令
tmp <- lapply(c(1,2,3), sample_func)
返回列表列表:
[[1]]
[[1]]$w
[1] 2
[[1]]$u
[1] 3
[[2]]
[[2]]$w
[1] 3
[[2]]$u
[1] 4
[[3]]
[[3]]$w
[1] 4
[[3]]$u
[1] 5
您可以使用以下命令将新列添加到数据框中:
cbind(data, do.call(rbind, tmp))
# x y w u
# 1 1 5 2 3
# 2 2 6 3 4
# 3 3 7 4 5
更新以发表评论:
如果可能,您可以修改函数以返回数据框。
sample_func <- function(number)
{
data.frame(w = number + 1, u = number + 2)
}
tmp <- lapply(c(1,2,3), sample_func)
cbind(data, do.call(rbind, tmp))
结果将是一个带有数字列的数据框。