2014-06-25 109 views
0

我有一個很大的數據幀,我想根據幾個條件過濾和製作一個二進制數據幀。根據另一個條件的二進制數據製作一個數據幀

這是原來的數據幀:

a1 <- data.frame(
    ID = c(rep("ID_1",3),rep("ID_2",3)), 
    gene = c("A", "D", "X","D","D","A"), 
    C = c("Q", "R", "S","S","R","Q"), 
    D = c(8, 3, 3, 4, 5, 4), 
    E = sample(c("silent","non-silent"),6,replace=T) 
) 

例如:

ID gene C D E 
1 ID_1 A Q 8 non-silent 
2 ID_1 D R 3 silent 
3 ID_1 X S 3 silent 
4 ID_2 D S 4 non-silent 
5 ID_2 D R 5 silent 
6 ID_2 A Q 4 non-silent 

我現在已經取得一個空的數據幀與所述ID作爲列和基因爲行這樣:

dt=as.data.frame(matrix(NA, length(c(levels(a1$gene))), length(c(levels(a1$ID)))+1)) 
colnames(dt)[1] <- "gene" 
dt[,"gene"]=c(levels(a1$gene)) 
colnames(dt)[-1]=levels(a1$ID) 

    gene ID_1 ID_2 
1 A NA NA 
2 D NA NA 
3 X NA NA 

現在我想爲每個ID存在1個基因,對於那些不存在的基因存在0個。我以後也想包括其他條件。例如,只在E列中放置一個非沉默的1。有沒有一個R基地的方式來做到這一點,或與包如data.table或ddply?

回答

3

您可以使用dcastreshape2包:

library(reshape2) 
dcast(a1, gene ~ ID) 
# gene ID_1 ID_2 
# 1 A 1 1 
# 2 D 1 2 
# 3 X 1 0 

dcast(a1, gene ~ ID, fun.aggregate = function(x) (length(x) > 0L) * 1L) 
# gene ID_1 ID_2 
# 1 A 1 1 
# 2 D 1 1 
# 3 X 1 0 

它也可用於數據表。

+0

這是一個很好的解決方案,它對於這個例子來說是完美的。但是我對原始數據有一些奇怪的結果。錯誤消息:使用freq作爲值列:使用value.var來覆蓋。並不是所有的ID都存在於二進制表中。 –

+0

我不知道你的真實數據,但爲了擺脫警告(?)消息,只需明確指定'value.var =「ID」'。 – lukeA

+0

解決了,謝謝!但是如果我想包含其他列,例如在E列中只有非沉默的東西呢? –

1

要查看是否有基因存在於每個ID:

dt$ID_1 <- dt$gene %in% a1[a1$ID == "ID_1", ]$gene 
dt$ID_2 <- dt$gene %in% a1[a1$ID == "ID_2", ]$gene 

所以dt$ID_1 & dt$ID_2會給你那些存在於兩個。

如果你有很多ID並且你想迭代它們,你可以使用例如: lapply,如果你想將它應用到其他列,你只需要用一個變量來替換這個字符串(並把它變成一個函數)。

相關問題