2012-05-15 79 views
1

我有這樣一個數據幀進行計數:發生在一個data.frame

G1 G2 G3 
    a b f 
    b c a 
    c d b 

和參考列表: L: 一個 b Ç d Ë ˚F

我想有以下的輸出:

a: 2, G1,G3 (that is "a" occurs two times in G1 and in G3 column) 
b: 3, G1,G2,G3 
c: 2, G1,G2 

等.. 誰能幫助我?抱歉打擾你,但我是新的R 在此先感謝。

愛蓮

回答

1

我以另一種方式嘗試這個。

A=data.frame(G1=c("a","b","c"), G2=c("b","c","d"), G3=c("f","a","b")) 

B= melt(as.matrix(A)) 
B$X2 =as.character(B$X2) 
B1=table(as.matrix(A)) 
D=aggregate(X2~value , B, FUN=c) 
D$cnt=B1[D$value] 
D 

輸出是

value   X2 cnt 
1  a  G1, G3 2 
2  b G1, G2, G3 3 
3  c  G1, G2 2 
4  d   G2 1 
5  f   G3 1 
+0

感謝vinux!有用!! – Elb

3

你可以做這樣的事情:

r <- reshape(d,varying=list(colnames(d)),direction='long', 
      v.names='value',times=colnames(d),timevar='colname') 

res <- by(r,r$value,FUN=function(x){unique(x$colname)}) 



> res 

r$value: a 
[1] "G1" "G3" 
------------------------------------------------------------ 
r$value: b 
[1] "G1" "G2" "G3" 
------------------------------------------------------------ 
r$value: c 
[1] "G1" "G2" 
------------------------------------------------------------ 
r$value: d 
[1] "G2" 
------------------------------------------------------------ 
r$value: f 
[1] "G3" 

基本上res是,信中會出現包含每個字母列表列名的向量,如:

res$a : 'G1', 'G3' 
res$b : 'G1', 'G2', 'G3' 
... 

如果你只想要發生的次數,你可以這樣做:

> lapply(res,length) 
$a 
[1] 2 

$b 
[1] 3 

$c 
[1] 2 

$d 
[1] 1 

$f 
[1] 1 

編輯:
要在文件上寫res,一種方式可能是以下幾點:

# prepare the table (data.frame) to be written 
dF <- do.call(rbind.data.frame, lapply(res,function(x){list(Occur=length(x),Columns=paste(x,collapse=' '))})) 
dF <- cbind(Letter=row.names(dF),dF) 
# write the table to file 
write.table(dF,row.names=FALSE,sep=',',file='myfile.csv') 

文件文本:

"Letter","Occur","Columns" 
"a",2,"G1 G3" 
"b",3,"G1 G2 G3" 
"c",2,"G1 G2" 
"d",1,"G2" 
"f",1,"G3" 
+0

@Eleonora:剛一說明:如果你的data.frame的第一行是:' 'A' 'B'「a''?在這種情況下,G3會出現2次「a」。在這種情況下,「a」的正確計數是多少? 2或3?如果它是前者保留當前的代碼;如果是後者,只需從'by'函數中刪除'unique' :) – digEmAll

+0

嗨,首先,非常感謝您的幫助!是的,我的data.frame的第一行是「a」,「b」,「f」。 「a」的正確計數是2,因爲它出現在G1和G3樣本中。事實上,你的代碼工作。我只是有最後一個問題。如何將res保存爲xls或txt文件?謝謝! – Elb

+0

@EleonoraLusito:檢查我的編輯;) – digEmAll

1

這裏這兩種方法都工作得很好了。只是想我會給我一個不同的方法,我用於類似的問題。

#Vinux's data: 
A=data.frame(G1=c("a","b","c"), G2=c("b","c","d"), G3=c("f","a","b")) 

B <- data.frame(x=rep(colnames(A), sapply(A, length)),  #means of reshaping data 
    y=c(apply(A, 2, as.character))) 
C <- split(B$x, B$y)           #column names by value 
D <- data.frame(letter=names(C), occurance=sapply(C, length)) #get occurrences 
D$column <- sapply(C, as.character)       #force vector of vectors 
D[, c(1, 3, 2), ]            #order it 

其中產量:

letter  column occurance 
a  a  G1, G3   2 
b  b G1, G2, G3   3 
c  c  G1, G2   2 
d  d   G2   1 
f  f   G3   1 
相關問題