2016-04-22 2 views
0

У меня есть длинный список авторов и слов что-то вродеРасчет пересечения большого количества множеств в R

author1,word1 
author1,word2 
author1,word3 
author2,word2 
author3,word1 

Фактический список насчитывает сотни авторов и тысячи слов. Он существует в виде CSV-файл, который я прочитал в dataframe и дублированный как

> typeof(x) 
    [1] "list" 
    > colnames(x) 
    [1] "author" "word" 

последние битый dput (головка (х)) выглядит

), class = "factor")), .Names = c("author", "word"), row.names = c(NA, 
    6L), class = "data.frame") 

То, что я пытаюсь сделать так, чтобы рассчитать, насколько похожи списки слов между авторами на основе пересечения списков слов автора в процентах от общего словаря авторов. (Я уверен, что есть правильные условия для того, что я делаю, но я не совсем понимаю, что это такое.)

В python или perl я бы сгруппировал все слова по автору и использовал вложенные циклы, чтобы сравнить всех со всеми, но мне интересно, как я это сделаю в R? У меня такое чувство, что «использование применяется» будет ответом - если это возможно, вы можете объяснить это маленькими словами для новичков, подобных мне?

+0

Это не описание, которое имеет одно основное представление. Вероятно, это список, как вы говорите, но структура не очевидна. Можете ли вы отредактировать сообщение, чтобы включить вывод 'dput (head (list_name))'? –

+0

Вы могли бы также найти [этот пост] (http://stackoverflow.com/questions/19891278/r-table-of-interactions-case-with-pets-and-houses) полезным; 'tcrossprod (таблица (x))/rowSums (таблица (x))'. –

+0

Спасибо alexis- но tcrossprod() работает только с равным количеством строк и столбцов, не так ли? – rw950431

ответ

1

Вот один из способов сделать это с помощью data.table:

## 1: generate test data 
set.seed(1L); 
wordList <- paste0('word',1:5); 
authorList <- paste0('author',1:5); 
rs <- sample(1:5,length(authorList),replace=T); 
aw <- data.table(
    author=factor(rep(authorList,rs)), 
    word=factor(do.call(c,lapply(rs,function(r) sort(sample(wordList,r))))), 
    key='author' 
); 
aw; 
##  author word 
## 1: author1 word4 
## 2: author1 word5 
## 3: author2 word3 
## 4: author2 word4 
## 5: author3 word1 
## 6: author3 word4 
## 7: author3 word5 
## 8: author4 word1 
## 9: author4 word2 
## 10: author4 word3 
## 11: author4 word4 
## 12: author4 word5 
## 13: author5 word2 
## 14: author5 word5 

## 2: initialize intersection table with unique combinations of authors 
ai <- aw[,setkey(setNames(nm=c('a1','a2'),as.data.table(t(combn(unique(author),2L)))))]; 

## 3: compute word intersection size for each combination of authors 
ai[,int:=length(intersect(aw[a1,word],aw[a2,word])),key(ai)]; 
##   a1  a2 int 
## 1: author1 author2 1 
## 2: author1 author3 2 
## 3: author1 author4 2 
## 4: author1 author5 1 
## 5: author2 author3 1 
## 6: author2 author4 2 
## 7: author2 author5 0 
## 8: author3 author4 3 
## 9: author3 author5 1 
## 10: author4 author5 2 

## 4: compute percentages 
ai[,`:=`(p1=int/aw[a1,.N],p2=int/aw[a2,.N]),key(ai)]; 
##   a1  a2 int  p1  p2 
## 1: author1 author2 1 0.5000000 0.5000000 
## 2: author1 author3 2 1.0000000 0.6666667 
## 3: author1 author4 2 1.0000000 0.4000000 
## 4: author1 author5 1 0.5000000 0.5000000 
## 5: author2 author3 1 0.5000000 0.3333333 
## 6: author2 author4 2 1.0000000 0.4000000 
## 7: author2 author5 0 0.0000000 0.0000000 
## 8: author3 author4 3 1.0000000 0.6000000 
## 9: author3 author5 1 0.3333333 0.5000000 
## 10: author4 author5 2 0.4000000 1.0000000 
+0

Это работало нормально в вашем тестовом наборе данных, но при выполнении моих реальных данных на шаге 3 появляется следующая ошибка: - «Ошибка в' .data.table' (aw, a2, word): Когда i - это данные. table (или символьный вектор), x должен быть привязан (например, отсортирован и отмечен как отсортированный), поэтому data.table знает, к каким столбцам присоединяется и использует x для сортировки. Сначала вызовите setkey (x, ...), см. «Setkey». Любая идея, что это пытается мне сказать? – rw950431

+0

В отличие от data.frames, data.tables может иметь набор ключей внутри объекта. Но ключ не является обязательным. Для некоторых типов синтаксиса требуется ключ. В моем ответе я явно устанавливаю ключ на '' ', когда создаю его, используя аргумент' key = 'author''. По вашим данным вы, вероятно, принуждали его к data.table с помощью 'as.data.table()' или 'setDT()', не указав ключ. Шаг 3 требует ключа, потому что он индексирует 'aw', используя только вектор символов (' a1' для первого индекса, 'a2' для второго). Вы можете решить проблему, назначив ключ после принуждения, вызывая 'setkey (aw, author);'. – bgoldst

+1

Это исправлено .. все работает сейчас. Так много R-awesomeness в 3 строках – rw950431

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