Home > Blockchain >  Adding a vector to each data frame sublisted in a list in R
Adding a vector to each data frame sublisted in a list in R

Time:02-04

I have

A <- rep(list(data.frame(a=c(1,2,3,2,1,4),b=c(7,3,1,2,2,1),c=c(2,3,7,2,2,8))),10)
B <- c(2,1,3,2,5,5)

and I would like to put B as a column of each data.frame in the list A

something like

[[1]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[2]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

I have found some stuff, but I can't figure out how works Map() or mapply()...

CodePudding user response:

The function you want here is lapply(). The lapply() function performs another function on each element of a list and returns a list.

A possible solution, using the simplified notation, suggested bellow, in a comment, by @BenNorris:

A <- rep(list(data.frame(a=c(1,2,3,2,1,4),b=c(7,3,1,2,2,1),c=c(2,3,7,2,2,8))),10)
B <- c(2,1,3,2,5,5)

lapply(A, cbind, d = B)

#> [[1]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[2]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[3]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[4]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[5]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[6]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[7]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[8]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[9]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5
#> 
#> [[10]]
#>   a b c d
#> 1 1 7 2 2
#> 2 2 3 3 1
#> 3 3 1 7 3
#> 4 2 2 2 2
#> 5 1 2 2 5
#> 6 4 1 8 5

CodePudding user response:

Try Map like this

> Map(cbind, A, d = list(B))
[[1]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[2]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[3]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[4]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[5]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[6]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[7]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[8]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[9]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[10]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

CodePudding user response:

Similar option in tidyverse

library(dplyr)
library(dplyr)
map(A, mutate, d = B)

-output

[[1]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5

[[2]]
  a b c d
1 1 7 2 2
2 2 3 3 1
3 3 1 7 3
4 2 2 2 2
5 1 2 2 5
6 4 1 8 5
...
  •  Tags:  
  • Related