我有一個很大的數據幀,我想根據幾個條件過濾和製作一個二進制數據幀。根據另一個條件的二進制數據製作一個數據幀
這是原來的數據幀:
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?
這是一個很好的解決方案,它對於這個例子來說是完美的。但是我對原始數據有一些奇怪的結果。錯誤消息:使用freq作爲值列:使用value.var來覆蓋。並不是所有的ID都存在於二進制表中。 –
我不知道你的真實數據,但爲了擺脫警告(?)消息,只需明確指定'value.var =「ID」'。 – lukeA
解決了,謝謝!但是如果我想包含其他列,例如在E列中只有非沉默的東西呢? –