【问题标题】:How do you add a column to data frames in a list?如何在列表中的数据框中添加一列?
【发布时间】:2019-07-15 02:45:43
【问题描述】:

我有一个数据框列表。我想为每个数据框添加一个新列。比如我有如下三个数据框:

a = data.frame("Name" = c("John","Dor"))
b = data.frame("Name" = c("John2","Dor2"))
c = data.frame("Name" = c("John3","Dor3"))

然后我将它们放入一个列表中:

dfs = list(a,b,c)

然后我想为每个数据框添加一个具有唯一值的新列,例如:

dfs[1]$new_column <- 5

但我收到以下错误:

"number of items to replace is not a multiple of replacement length"

我也尝试过使用两个括号:

dfs[[1]]$new_column <- 5

这不会返回错误,但不会添加列。

这将处于“for”循环中,并且将向每个数据帧添加不同的值。

任何帮助将不胜感激。提前致谢!

【问题讨论】:

  • 不,抱歉我应该指定的。这将在一个 for 循环中,并且每个数据帧都会有不同的值。
  • 尝试使用[[而不是[进行索引
  • @Camille 谢谢。我已经尝试过了,它没有返回错误,但没有添加数据框列。
  • @RonakShah 添加了一个可重现的示例

标签: r dataframe wrangle


【解决方案1】:

假设您想为每个数据框添加一个值为 5:7 的新列。我们可以使用Map

new_value <- 5:7
Map(cbind, dfs, new_column = new_value)

#[[1]]
#  Name new_column
#1 John          5
#2  Dor          5

#[[2]]
#   Name new_column
#1 John2          6
#2  Dor2          6

#[[3]]
#   Name new_column
#1 John3          7
#2  Dor3          7

lapply 你可以这样做

lapply(seq_along(dfs), function(i) cbind(dfs[[i]], new_column = new_value[i]))

或者正如@camille 提到的,如果您在for 循环中使用[[ 进行索引,它就可以工作

for (i in seq_along(dfs)) {
    dfs[[i]]$new_column <- new_value[[i]]
}

等效的 purrr 版本是

library(purrr)
map2(dfs, new_value, cbind)

map(seq_along(dfs), ~cbind(dfs[[.]], new_colum = new_value[.]))

【讨论】:

  • 谢谢!但是,我有一个问题要问您:当我使用双括号时,初始数据框(例如“a”)不会添加列,但列表中的“a”确实会添加列。这是为什么呢?
  • @jtam 因为dfs 是一个单独的对象,a 是一个单独的对象。在for 循环中,我们只为dfs 对象添加一列,它独立于a
  • 感谢您的解释——感谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2022-06-15
  • 2020-09-15
相关资源
最近更新 更多