2012-05-15 2 views
1

У меня есть кадр данных, как это:появления подсчета в data.frame

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

и список ссылок: Л: б с д х х

Я бы хотел (а) имеют следующий вывод:

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 Спасибо заранее.

Eleonora

ответ

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 

EDIT:
Чтобы написать 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''? В этом случае '' a'' будет отображаться 2 раза в G3. Каково правильное значение '' a '' в этом случае? 2 или 3? Если это первый, сохраните текущий код; если это последний, просто удалите 'unique' из функции' by' :) – 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 
Смежные вопросы