2017-09-01 5 views
1

Ich versuche, 2 Listen von Listen, die von ungleicher Länge sind, in einen Datenrahmen zu kombinieren.r - Wie man mehrere Listen von Listen zu einem Datenrahmen kombiniert

Ich beginne mit einer Liste mit 2 Matrizen.

mtx_a <- matrix(data = c(1:24), nrow = 4) 
mtx_b <- matrix(data = c(25:36), nrow = 3) 
row.names(mtx_a) <- c("A", "B", "C", "D") 
row.names(mtx_b) <- c("A", "B", "C") 
colnames(mtx_a) <- c("V1", "V2", "W1", "W2", "X1", "X2") 
colnames(mtx_b) <- c("Y1", "Y2", "Z1", "Z2") 
mtx_list <- list(mtx_a, mtx_b) 
names(mtx_list) <- c("mtx_a", "mtx_b") 
mtx_list 

Ich habe eine bestimmte Zeile basierend auf rowname zu untersuchen extrahiert.

mtx_list <- lapply(mtx_list, function(mtx_list){ 
    mtx_list[row.names(mtx_list) %in% c("A"),]}) 

Als nächstes extrahierte ich spezifische Spalten basierend auf ihrem Index. (Alternierende Spalten entsprechen Bedingung 1 und 2).

cond_1 <- lapply(lapply(mtx_list, function(mtx_list) { 
    mtx_list[c(T,F)]}), unname) 
cond_2 <- lapply(lapply(mtx_list, function(mtx_list) { 
    mtx_list[c(F,T)]}), unname) 

Ich versuche, einen Datenrahmen zu erzeugen, die wie folgt aussieht:

 cond_1 cond_2 
mtx_a 1  5 
mtx_a 9  13 
mtx_a 17  21 
mtx_b 25  28 
mtx_b 31  34 

ich versucht habe, die folgenden haben aber haben keinen Erfolg:

list(cond_1, cond_2) 
library(plyr) 
ldply(c(cond_1, cond_2)) 

Antwort

2

Sie Map verwenden können zu cbind jeweiligen Listenelementen.

do.call(rbind, Map(cbind, cond_1, cond_2)) 
#  [,1] [,2] 
#[1,] 1 5 
#[2,] 9 13 
#[3,] 17 21 
#[4,] 25 28 
#[5,] 31 34 

Ein wenig mehr Arbeit kann man etwas besseres Ergebnis Hier

data.frame(mtx = unlist(lapply(1:length(cond_1), 
           function(i) 
            rep(names(cond_1)[i], length(cond_1[[i]])))), 
    do.call(rbind, Map(cbind, cond_1, cond_2))) 
# mtx X1 X2 
#1 mtx_a 1 5 
#2 mtx_a 9 13 
#3 mtx_a 17 21 
#4 mtx_b 25 28 
#5 mtx_b 31 34 
2

geben ist eine Alternative sapply verwenden. Ich habe es in eine Funktion für die leichtere wiederholte Verwendung eingewickelt.

getter <- function(rowName) { 
    # loop through matrices in list, pull out rows that match name 
    temp <- unlist(sapply(mtx_list, function(x) x[rowName,]), use.names=FALSE) 
    # return data.frame with alternating values 
    data.frame(var1=temp[c(TRUE, FALSE)], var2=temp[c(FALSE, TRUE)]) 
} 

getter("A") 
    var1 var2 
1 1 5 
2 9 13 
3 17 21 
4 25 28 
5 31 34 

Beachten Sie, dass alle Matrizen in der Liste den Zeilennamen für diese Funktion enthalten müssen.

4

Extract alle "A" Reihen zuerst, dann füttern nur in eine 2-Säulen-Matrix:

matrix(unlist(lapply(mtx_list, `[`, "A",)), ncol=2, byrow=TRUE) 
#  [,1] [,2] 
#[1,] 1 5 
#[2,] 9 13 
#[3,] 17 21 
#[4,] 25 28 
#[5,] 31 34 

die in data.frame() gewickelt werden kann, wenn nötig.

Verwandte Themen