2014-08-28 5 views
1

Допустим, у меня есть кадр данных из трех столбцов: первый указывает номер функции (например, цвет), второй - группу и третий, если эта функция присутствует в что группа (1) или отсутствует в этой группе (0):Сравнение перекрестков между группами, указанными в первом столбце

> d<-data.frame(feature=c("red","blue","green","yellow","red","blue","green","yellow"), group=c(rep("a",4),rep("b",4)),is_there=c(0,1,1,0,1,1,1,0)) 
> d 
    feature group is_there 
1  red  a  0 
2 blue  a  1 
3 green  a  1 
4 yellow  a  0 
5  red  b  1 
6 blue  b  1 
7 green  b  1 
8 yellow  b  0 

Теперь я хотел бы иметь краткую информацию о том, сколько функции: 1. только в группе а, только в группе б и сколько в настоящее время в обеих группах. Кроме того, мне нужно извлечь имя функций, присутствующих в обеих группах. Как я могу это сделать? Я полагаю, что такая функция, как crossprod, может помочь, но я не могу понять.

Выходной сигнал будет что-то вроде:

feature 
red  1 
blue 2 
green 2 
yellow 0 

или:

feature a b 
red  0 1 
blue 1 1 
green 1 1 
yellow 0 0 

любом случае мне нужен лучший обзор над довольно большим файлом данными (оригинал имеет сотни функций примерно 10 групп) ,

ответ

2

Это звучит как table является то, что вы хотите. Сначала мы подмножаем строки таким образом, чтобы столбец is_there равнялся 1 и удалял третий столбец. Затем мы назовем table на этом подмножестве.

> (tab <- table(d[d$is_there == 1, -3])) 
#   group 
# feature a b 
# blue 1 1 
# green 1 1 
# red 0 1 
# yellow 0 0 

A table является матрично подобранным объектом. Мы можем работать на нем так же, как и на matrix.

Глядя на группу a:

> tab[,"a"]       ## vector of group "a" 
# blue green red yellow 
#  1  1  0  0 
> tab[,"a"][ tab[,"a"] > 0 ]   ## present in group "a" 
# blue green 
#  1  1 
> names(tab[,"a"][ tab[,"a"] > 0 ]) ## "feature" present in group "a" 
# [1] "blue" "green" 

И то же самое для группы b.

+0

Это не показывает, что желтый нет в любой из двух групп? Возможно, мой вопрос был неточно спрошен. – aldorado

+0

@aldorado - Я сделал редактирование –

+0

@Richard Scriven +1 Ваша 'таблица' более чистая, чем моя – akrun

1
tbl <- table(d$feature[!!d$is_there], d$group[!!d$is_there]) 
rowSums(tbl) 
#blue green red yellow 
# 2  2  1  0 

tbl 

#  a b 
#blue 1 1 
#green 1 1 
#red 0 1 
#yellow 0 0 

Если вы хотите, чтобы иметь группировки, как показано ниже:

d1 <- as.data.frame(matrix(rep(c("none", "only", "both")[rowSums(tbl)+1], 
      each=2), ncol=2, byrow=TRUE, dimnames=dimnames(tbl)), 
              stringsAsFactors=FALSE) 

    d1[!tbl & rowSums(tbl)==1] <- "" 
    d1 
#  a b 
#blue both both 
#green both both 
#red   only 
#yellow none none   
+0

Великих умов мыслят одинаково. –

+0

@Richard Scriven Я не уверен, что это то, чего хочет OP. Может быть, это ваше решение. – akrun

+0

Является ли двойной «!!» отличается от "!" ? – aldorado

0

будет ли это делать трюк?

> tapply(d$feature[d$is_there==1],d$group[d$is_there==1], table) 

$a 
blue green red yellow 
    1  1  0  0 

$b 
blue green red yellow 
    1  1  1  0 
1

Попробуйте следующий код:

with(d, tapply(is_there, list(feature, group), sum)) 
#  a b 
#blue 1 1 
#green 1 1 
#red 0 1 
#yellow 0 0 
0

Возьмите кадр следующие данные:

myd <- data.frame(
    feature=c("red","blue","green","yellow","red","blue","green","yellow"), 
    group=c(rep("a",4),rep("b",4)), 
    is_there=c(0,1,1,0,1,0,1,0)) 

Чтобы получить фактор говорит вам, где все, вы можете попробовать этот код:

require(reshape2) 

res <- acast(myd,feature ~ group, fun=sum, value.var="is_there") 
where <- factor(
    colSums(res) - 2*diff(t(res)), 
    levels=c(-1,0,2,3), 
    labels=c("group2","nowhere","both","group1") 
) 

Дает:

> res 
     a b 
blue 1 0 
green 1 1 
red 0 1 
yellow 0 0 
> where 
    blue green  red yellow 
group1 both group2 nowhere 
Levels: group2 nowhere both group1 

Извлечение тех, которые присутствуют во всем мире, здесь тривиально.

Обратите внимание, что любой из других решений, дающих вам матрицу res в равной степени действительный (tapply решения будет быстрее)

+0

'tapply' быстрее, чем' table'? –

+0

@RichardScriven 'tapply' быстрее, чем' acast', а 'table' дает другой результат (как в: не тот, который вам нужен здесь) –

Смежные вопросы