2013-07-24 5 views
2

и спасибо уже за тонну статей о моей (еще не заданной) проблеме, которая доставила меня еще дальше!R: подсчет нескольких вхождений строк в несколько столбцов (!)

Но все-таки, я не могу помочь, но поднять еще один из этих вопросов подсчета:

У меня есть большой набор данных, около 30 000 строк и пяти столбцов, наполненных именами. Всего в df имеется около 14 000 разных имен. Теперь меня интересует совпадение имен в строке, но независимо от того, находится ли имя в столбце 1,2,3 и так далее.

В качестве примера матрица может выглядеть следующим образом (вероятно, ужасно закодированы):

testmatrix<- matrix(nrow=52, ncol=5) 


for (i in 1:5) { 

    testmatrix[,i]<-(sample(letters, replace=T)) 

    } 

data<-as.data.frame(testmatrix) 

Моя последняя матрица должна затем иметь (в тестовом примере) 26 строк и 26 столбцов (в «реальной» набора данных 14 000 × 14 000), со всеми сопутствующими событиями. Я мог бы работать с aggregate (я думал), но тогда мне пришлось бы создавать множество dfs для каждой колонки-диады (1-2, 1-3, 1-4 и т. Д.) - возможно, есть уникальная и более простая функция для этого (возможно, даже в пакете plyr?).

Спасибо всем уже, я надеюсь, что это легко для вас;)

Бест, Al

+1

Ваш код не работает, вы хотите 'testmatrix [, i] <- sample (буквы, 5, replace = T) '. Кроме того, я не совсем понимаю, как должен выглядеть вывод. Что должно быть в строках и столбцах искомой матрицы? – Henrik

+0

Привет, Хенрик, спасибо за быстрый ответ! И извините за неправильный код (у меня был более короткий пример с 52 строками, т. Е. Кратным 26 букв). Результат должен иметь каждое уникальное имя как переменные (например, столбцы) и строки для каждого уникального имени. - Клетки должны быть заполнены частотой совместного взаимодействия каждой диады в ряду исходного df. - В примере df он должен создать матрицу 26x26 для каждой буквы с частотой каждой диады в соответствующих ячейках. Это яснее? Еще раз спасибо! –

+0

Непонятно. покажите желаемый результат в небольшом примере. например, матрица из 3 строк, 4 столбца с 6 буквами – agstudy

ответ

2

Нечто подобное могло бы помочь вам начать работу ...

# an example matrix of letters 
m <- matrix(sample(letters, 30, replace=T), nrow=6, ncol=5) 
m 

# the unique values in the matrix 
vals <- sort(unique(as.vector(m))) 

# rearrange the data so that each value is a column 
bigm <- t(apply(m, 1, function(row) match(vals, row, nomatch=0))) 
colnames(bigm) <- vals 
bigm 

# count the co-occurences of each value (diagonal is total number of rows with that value) 
crossprod(bigm>0) 
+0

Woohooooo, спасибо! Однако я должен попробовать большой набор данных, но это выглядит идеально. Я не уверен, как это работает, но, похоже, это так. Я скажу вам, работает ли это с остальными. Спасибо всем, высоко оценил! –

+0

Это выглядит потрясающе. – texb

+0

Это неверно, так как он сопоставляет совпадения персонажа с самим собой. – nwknoblauch

1

Я не мог придумать симпатичный функциональный способ сделать это, но это удивительно быстро.

x <- matrix(as.character(sample(1:14000,30000*5,replace=T)),30000,5) 
countmat <- matrix(0,14000,14000,dimnames=list(as.character(1:14000),as.character(1:14000))) 
for(i in 1:nrow(x)) 
    { 
    xc <- table(x[i,],x[i,]) 
    countmat[rownames(xc),colnames(xc)] <- countmat[rownames(xc),colnames(xc)]+xc 
    } 

EDIT:

Я тогда понял, что это мило функциональный способ сделать это, но это слишком большой объем памяти для моей машины

x <- matrix(as.character(sample(1:14000,30000*5,replace=T)),30000,5) 
cx <- adply(x,.margins=1,.fun=function(x)table(x,x)) 
+0

Привет и спасибо! Второй - для моей машины тоже трудно, и я не могу запустить первый (ошибка dimnames - я добавил одну скобку для матричной команды, верно?), Но в любом случае одна из них внизу работает, как раз второй ... –

+0

Спасибо, что указали это. Первое решение должно теперь работать. Если вы попробуете второе решение с меньшей матрицей, вы обнаружите, что оно работает (например, 'adply (x [1:30,]] .margins = 1, .fun = функция (х) таблица (х, х)) '). – nwknoblauch

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