2015-02-20 21 views
8

Ho due liste con struttura diversa:Combinare due liste in una dataframe in R

listA <- list(c("a","b","c"), c("d","e")) 
listB <- list(0.05, 0.5) 

listA 
[[1]] 
[1] "a" "b" "c" 

[[2]] 
[1] "d" "e" 

listB 
[[1]] 
[1] 0.05 

[[2]] 
[1] 0.5 

Ho un'idea di come utilizzare loop di combinare entrambe le liste in un dataframe che assomiglia a quella qui sotto, ma ho Sono sicuro che esiste un modo più efficiente per farlo.

data.frame(A = c("a","b","c","d","e"), B = c(rep(0.05,3), rep(0.5,2))) 
    A B 
1 a 0.05 
2 b 0.05 
3 c 0.05 
4 d 0.50 
5 e 0.50 

risposta

14

Questa è un'altra opzione:

do.call(rbind, Map(data.frame, A=listA, B=listB)) 

# A B 
# 1 a 0.05 
# 2 b 0.05 
# 3 c 0.05 
# 4 d 0.50 
# 5 e 0.50 
2

forse c'è un modo più elegante che mantiene la classe di elementi numericlist2 s' ... Ma questo funziona così

df <- do.call(rbind,mapply(cbind, listA, listB)) 
df <- as.data.frame(df, stringsAsFactors = FALSE) 
df[,2] <- as.numeric(df[,2]) 

EDIT modo migliore è la soluzione di Matthew Plourde utilizzando Map aka mapply(data.frame, A=listA, B=listB, SIMPLIFY = FALSE)

1

Ecco un altro modo:

do.call(rbind, 
     lapply(1:length(listA), 
       function(i) 
       data.frame(A=unlist(listA[i]), 
          B=unlist(listB[i])))) 
2

preferisco questo:

do.call(rbind, 
     Map(function(...) setNames(cbind.data.frame(...), 
            c("A", "B")), 
      listA, listB)) 
# A B 
#1 a 0.05 
#2 b 0.05 
#3 c 0.05 
#4 d 0.50 
#5 e 0.50