查找多个列表元素之间的重复项

时间:2014-03-11 14:24:54

标签: r

我有一个由800个元素组成的列表。每个元素都是一个字符向量。

我想浏览此列表并确定重复的元素,其中有许多元素。

有没有办法做到这一点?

例如:

mylist[[1]] = c('aaab','aaab','aaab', 'abcd')
mylist[[2]] = c('defg','defg','defg','abcd')
...
mylist[[80]] = c('ghgh','ghgh','ghgh','abcd')

在这种情况下,我想找到第1,第2和第80个元素中的重复条目(' abcd')

3 个答案:

答案 0 :(得分:2)

我仍然觉得这个问题发展不足,但您可能会在stack + table + colSums或{rowSums + mylist <- list(c("aaab", "aaab", "aaab", "abcd"), c("defg", "defg", "defg", "abcd"), c("ghgh", "ghgh", "ghgh", "abcd"), c("aaaa", "aaaa", "aaaa", "aaaa")) + {1}},视您的需要而定。

一些示例数据:

stack

data.frame将其放入一个包含两列的长list中,&#34; ind&#34;和&#34;价值观&#34;。 &#34; IND&#34;对应于X <- stack(setNames(mylist, seq_along(mylist))) 索引号,而&#34;值&#34;是指...值。

table

使用table(X) # ind # values 1 2 3 4 # aaaa 0 0 0 4 # aaab 3 0 0 0 # abcd 1 1 1 0 # defg 0 3 0 0 # ghgh 0 0 3 0 为我们提供每个字词的频率&#34; ind&#34;。

colSums

colSums(table(X) > 0) # 1 2 3 4 # 2 2 2 1 which(colSums(table(X) > 0) > 1) # 1 2 3 # 1 2 3 会告诉我们哪些列表项目本身有重复项目。

rowSums

rowSums(table(X) > 0) # aaaa aaab abcd defg ghgh # 1 1 3 1 1 which(rowSums(table(X) > 0) > 1) # abcd # 3 names(which(table(X)["abcd", ] >= 1)) # [1] "1" "2" "3" 会告诉我们哪些列表项之间有重复的项目。

{{1}}

答案 1 :(得分:1)

也许是矫枉过正,但tm包为这样的任务提供了支持:

library(tm)
mylist <- list(c("aaab", "aaab", "aaab", "abcd"),
          c("defg", "defg", "defg", "abcd"), c("ghgh", "ghgh", "ghgh", "abcd"))

m <- as.matrix(TermDocumentMatrix(Corpus(VectorSource(mylist))))
m[which(rowSums(!!m)>1),,drop=FALSE]
      Docs
Terms  1 2 3
  abcd 1 1 1

答案 2 :(得分:0)

似乎所有列表元素都具有相同的大小。如果是这样的话,你可以把它变成一个矩阵:

mylist <- list(c('aaab','aaab','aaab','abcd'),
               c('defg','defg','defg','abcd'),
               c('defg','defg','defg','ghij'),
               c('ghgh','ghgh','ghgh','abcd'))

mat <- do.call(rbind, mylist)

apply(mat, 2, duplicated)
#      [,1]  [,2]  [,3]  [,4]
#[1,] FALSE FALSE FALSE FALSE
#[2,] FALSE FALSE FALSE  TRUE
#[3,]  TRUE  TRUE  TRUE FALSE
#[4,] FALSE FALSE FALSE  TRUE