我有一个由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')
答案 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