Как добавить столбец к фреймам данных в списке?

У меня есть список фреймов данных. Я хочу добавить новый столбец в каждый фрейм данных. Например, у меня есть три кадра данных следующим образом:

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, и к каждому фрейму данных будет добавлено другое значение.

Любая помощь приветствуется. Заранее спасибо!

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[.]))
Другие вопросы по тегам