2016-05-01 49 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