2016-05-01 53 views
1

我創建2個數據幀:

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) 

我嘗試使用合併這些數據幀2:

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

但我得到這個錯誤:

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

我做錯了嗎?

回答

0

錯誤背後的原因是,在你已經提到dataframes,列被存儲爲list而不是基本數據類型,如整數,數字,字符,等因子

當一個運行此命令,一個對發生了什麼有了一些真正的想法。

> 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 

解決方案:

1)可以存儲dataframes這樣的:

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

有沒有辦法強迫列表級我的數據的基礎數據? – ALejandro

+0

是的。有一種方法。但在這種情況下,所有元素將只有一種類型。你可以去'unlist()'函數 –

+1

@ALejandro;有一點需要注意的是基因在兩個數據框中是不同的情況,因此沒有共同的基因可以匹配。所以先強制降低(或大寫)。然後你可以合併'df2 $ gene < - tolower(df2 $ gene);合併(lapply(df1,unlist),lapply(df2,unlist),by =「gene」,all = TRUE)'。不過,我會盡量避免將數據放在這樣的格式中。 – user20650