Как добавить список массивов в список фреймов данных в R - PullRequest
1 голос
/ 07 мая 2020

У меня есть следующий список.

df1 <- data.frame(a = rnorm(10), b = rnorm(10), vector = 1)
df2 <- data.frame(a = rnorm(10), b = rnorm(10), vector = 2)
df3 <- data.frame(a = rnorm(10), b = rnorm(10), vector = 3)
df4 <- data.frame(a = rnorm(10), b = rnorm(10), vector = 4)

ls_df <- list(df1, df2, df3, df4)

И еще у меня есть еще один список массивов.

a1 <- rep(1, 10)
a2 <- rep(2, 10)
a3 <- rep(3, 10)
a4 <- rep(4, 10)

ls_a <- list(a1, a2, a3, a4)

Я хочу заменить столбец a в каждом фрейме данных в ls_df таким образом, что ls_df[[1]]$a содержит 1, lf_df[[2]]$a содержит 2 и т. Д.

Я пробовал следующее ... по-видимому, работает не так, как задумано. пожалуйста ??

Ответы [ 2 ]

4 голосов
/ 07 мая 2020

Мы можем использовать Map:

ls_df <- Map(function(x, y) {x$a <- y;x}, ls_df, ls_a)

То же самое можно сделать с map2 из purrr.

purrr::map2(ls_df, ls_a, ~{.x$a <- .y;.x})

Вы, вероятно, имеете в виду от a1 до a4 длины 10, а не 20, поскольку количество строк в ls_df равно 10.

a1 <- rep(1, 10)
a2 <- rep(2, 10)
a3 <- rep(3, 10)
a4 <- rep(4, 10)
ls_a <- list(a1, a2, a3, a4)
1 голос
/ 07 мая 2020

Не так лаконично, как функция карты @Ronak Shah:

ls_df <- lapply(seq_along(ls_df), function(i){
    ls_df[[i]]$a <- i; return(ls_df[[i]])
  }
)

Использование карты:

Map(function(i){ls_df[[i]]$a <- i; ls_df[[i]]}, seq_along(ls_df))

Данные:

df1 <- data.frame(a = rnorm(10), b = rnorm(10), vector = 1)
df2 <- data.frame(a = rnorm(10), b = rnorm(10), vector = 2)
df3 <- data.frame(a = rnorm(10), b = rnorm(10), vector = 3)
df4 <- data.frame(a = rnorm(10), b = rnorm(10), vector = 4)
ls_df <- list(df1, df2, df3, df4)
...