2016-05-01 10 views
1

Ich habe 2-Datenrahmen:

x = list("a", "b",1,2) 
m1=matrix(x,2,2) 
colnames(m1) <- c("gene", "fc") 

y = list("A", "B", "C",1,2,3) 
m2 = matrix(y,3,2) 
colnames(m2) <- c("gene", "fc") 

df1 <- as.data.frame(m1) 
df2 <- as.data.frame(m2) 

Ich versuche, diese 2 Datenrahmen zu fusionieren mit:

merged <- merge(df1, df2, by=("gene")) 

Aber ich habe diesen Fehler:

Error in sort.list(bx[m$xi]) : 'x' must be atomic for 'sort.list' Have you called 'sort' on a list?

Was mache ich falsch?

Antwort

0

Der Grund für den Fehler ist, dass in Datenrahmen, die Sie erwähnt haben, werden die Spalten als list und nicht die Basisdatentypen wie Integer gespeichert, nummerisch, Zeichen, Faktor usw.

Wenn man diesen Befehl ausgeführt wird, ein bekommt eine gute Vorstellung davon, was vor sich geht.

> str(df1) 
'data.frame': 2 obs. of 2 variables: 
$ gene:List of 2 
    ..$ : chr "a" 
    ..$ : chr "b" 
$ fc :List of 2 
    ..$ : num 1 
    ..$ : num 2 

Lösung:

1) Sie können die Datenrahmen wie folgt aus:

df1 <- data.frame(gene = c('a','b'),fc = c(1,2)) 

df2 <- data.frame(gene = c('a','b','c'),fc = c(1,2,3)) 

merge(df1,df2,by='gene') 
+0

Gibt es eine Möglichkeit, die Liste-Klasse meiner Daten an die Basisdaten zu zwingen? – ALejandro

+0

Ja. Da ist ein Weg. Aber in diesem Fall werden alle Elemente nur von einem Typ sein. Sie können für 'unlist()' Funktion gehen –

+1

@ALejandro; eine Sache zu beachten ist, dass die Gene ein anderer Fall in Ihren zwei Datenrahmen sind, daher gibt es keine gemeinsamen Gene zu entsprechen. Also zwinge zuerst, beide zu senken (oder groß). Sie können dann mit 'df2 $ gen <- tolower (df2 $ gen); merge (lapply (df1, unlist), lapply (df2, unlist), durch = "gen", all = TRUE) '. Ich würde jedoch versuchen, Ihre Daten in einem solchen Format zu vermeiden. – user20650