2016-12-06 3 views
0

Ich versuche, einen Vektor zu glätten, der eine Anzahl von Listen enthält. Was wäre der beste Weg, dies zu tun, während die mit dieser Liste verbundenen Daten beibehalten werden? Ich habe versucht, unlist zu verwenden, aber das gab mir eine Liste, die nicht mit meinen Daten verbunden war.Abflachender Vektor mit Listen in R

## My data set looks something like this: 
df <- data.frame(A = c(1,2,3), 
       B = c(3,5,4), 
       C = c(4,3,5), 
       D = c(7,9,2)) 
df$E <- list(c(5, 3, 2, 1), 5, c(5, 2, 1)) 
df 
## A B C D   E 
## 1 1 3 4 7 5, 3, 2, 1 
## 2 2 5 3 9   5 
## 3 3 4 5 2 5, 2, 1 

## Ideally I would like it to look like this: 
A B C D E 
1 1 3 4 7 5 
2 1 3 4 7 3 
3 1 3 4 7 2 
4 1 3 4 7 1 
5 2 5 3 9 5 
6 3 4 5 2 5, 
7 3 4 5 2 5 
8 3 4 5 2 2 
9 3 4 5 2 1 

Gibt es eine einfache Möglichkeit, das zu tun?

+2

'tidyr :: unnest' –

+0

Besonders gut gefällt mir diese Fragen zu bekommen, Sie wollen ein reproduzierbares Beispiel geben, nicht nur eine Darstellung dessen, wie das Objekt aussieht. Einige Anleitung: http://StackOverflow.com/a/28481250/ – Frank

+0

In der Basis R: 'data.frame (df [rep (1: nrow (df), Längen (df $ E)), 1: 4], E = unlist (df $ E), row.names = NULL) ' – Jaap

Antwort

2

Sehr einfach. Nehmen wir an, Ihr Datenrahmen heißt df.

library(tidyr) 
df %>% unnest(E) 

Daten:

structure(list(A = 1:3, B = c(3L, 5L, 4L), C = c(4L, 3L, 5L), 
D = c(7L, 9L, 2L), E = list(c(5, 3, 2, 1), 5, c(5, 2, 1))), .Names = c("A", 
"B", "C", "D", "E"), row.names = c(NA, -3L), class = "data.frame") 
1

Wahrscheinlich nicht der kürzeste Weg, um darüber zu gehen, aber das wird die Ergebnisse, die Sie wollen, ohne sich auf eine zusätzliche Bibliothek bekommen.

Zuerst werden die Datensatz selbst zu definieren, wie Sie

testdata<-t(matrix(list(1,3,4,7,c(5,3,2,1), 
         2,5,3,9,5, 
         3,4,5,2,c(5,2,1) 
        ),nrow=5)) 

colnames(testdata)<-c("A","B","C","D","E") 

rownames(testdata)<-c(1,2,3) 

testdata beschrieben haben, ist wie folgt, wobei Numeric,4 ist c(5,3,2,1) und Numeric,3 ist c(5,2,1)

A B C D E   
1 1 3 4 7 Numeric,4 
2 2 5 3 9 5   
3 3 4 5 2 Numeric,3 

die ExpandAll Funktion überflüssig ist, aber es hilft, den Code in lesbarere Stücke aufzuteilen.

expandall<-function(x){ 
    do.call(cbind,x) 
} 

result<-apply(testdata,1,expandall) 
if(is.list(result)){ ## if there are sub arrays then apply will return 
        ## a list 
    result<-do.call(rbind,result) 
} 

Anwendung ExpandAll auf jede Zeile der Daten und die Bindung der Ergebnisse, die wir

 A B C D E 
[1,] 1 3 4 7 5 
[2,] 1 3 4 7 3 
[3,] 1 3 4 7 2 
[4,] 1 3 4 7 1 
[5,] 2 5 3 9 5 
[6,] 3 4 5 2 5 
[7,] 3 4 5 2 2 
[8,] 3 4 5 2 1