如何使用自定义函数向数据框添加多个新列?

时间:2014-01-10 07:56:52

标签: r dataframe

我有一个数据框,我想使用自定义函数向该数据框添加多个新列。这些新列将是现有列的某些功能,但它们需要使用自定义功能。

我目前正在尝试让我的自定义函数将结果返回到列表中,然后我将其解析为单独的列。这有时通过返回列表向量来工作,但有时会返回一个矩阵,在这种情况下我会得到一个像

这样的错误
  

$<-.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")

1 个答案:

答案 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))

结果将是一个带有数字列的数据框。