1

I have the following list.

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)

And, I also have another list of arrays.

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

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

I want to replace column a in each data frame in ls_df such that ls_df[[1]]$a contains 1's, lf_df[[2]]$a contains 2's, and so on.

I tried the following... apparently not working as intended.

ls_df <- lapply(ls_df["a"], function(x) ls_a)

Help, please??

useryk
  • 309
  • 2
  • 10

2 Answers2

4

We can use Map :

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

The same can be done with map2 from purrr.

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

You probably mean a1 to a4 of length 10 and not 20 since number of rows in ls_df are 10.

a1 <- rep(1, 10)
a2 <- rep(2, 10)
a3 <- rep(3, 10)
a4 <- rep(4, 10)
ls_a <- list(a1, a2, a3, a4)
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213
1

Not as succinct as @Ronak Shah's Map function:

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

Using Map:

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

Data:

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)
hello_friend
  • 5,682
  • 1
  • 11
  • 15