Tengo una lista de marcos de datos

df1=data.frame(yield=c(7,4,8),temp=c(25,28,30)) 
df2=data.frame(yield=c(6,5,8),temp=c(26,25,26))
df3=data.frame(yield=c(3,4,7),temp=c(31,28,27)) 

l1=list(df1,df2,df3)

Y una lista de personajes

l2=list("high N","mid N","low N")

Estoy tratando de crear una variable llamada "trt" en cada marco de datos y llenarlo con cada elemento de la lista de caracteres.

En un marco de datos se vería así:

df1$trt=l2[[1]]

Pero cuando trato de darle una vuelta, no consigo lo que estoy buscando.

Lo intenté:

l3=lapply(l1,function(x) x$trt=l2)

Y

l3=lapply(l1,function(x,y) x$trt=l2[[y]])

Cualquier ayuda es muy apreciada!

2
Gerry 17 oct. 2018 a las 00:27

2 respuestas

La mejor respuesta

No estoy completamente seguro de lo que esperaba, pero intente Map

Map(`[<-`, l1, i = "trt", value = l2)
  yield temp    trt
1     7   25 high N
2     4   28 high N
3     8   30 high N

[[2]]
  yield temp   trt
1     6   26 mid N
2     5   25 mid N
3     8   26 mid N

[[3]]
  yield temp   trt
1     3   31 low N
2     4   28 low N
3     7   27 low N
2
markus 16 oct. 2018 a las 21:34

O usa transform

Map(transform, l1, trt = l2)
#[[1]]
#  yield temp    trt
#1     7   25 high N
#2     4   28 high N
#3     8   30 high N

#[[2]]
#  yield temp   trt
#1     6   26 mid N
#2     5   25 mid N
#3     8   26 mid N

#[[3]]
#  yield temp   trt
#1     3   31 low N
#2     4   28 low N
#3     7   27 low N

Con tidyverse, podemos usar mutate

library(tidyverse)
map2(l1, l2, ~ .x %>% 
                   mutate(trt = .y))
0
akrun 17 oct. 2018 a las 02:40