我有一个像这样的字符向量列表:
my_list <- list(c('a','b','c','d','e'),c('e','f','g'),c('h','i','j'))
names(my_list) <- c("group1","group2","group3")
Run Code Online (Sandbox Code Playgroud)
我想要一种简单的方法来测试my_list列表中 3 个组/向量中任意一个的字母是否重复。例如,“e”同时出现在组 1 和组 2 中,因此这将是重复的。如果 2 个或更多组中至少有一个或多个重复项,那么任何简单的只返回逻辑值的操作都是理想的。因此,返回 FALSE 意味着每个组中的字母仅对该组而言是唯一的(显然,在我的示例中不是这种情况)。
非常感谢!
可以生成二进制输出
any(duplicated(unlist(my_list)))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
正如 @sindri_baldur 在评论中正确指出的那样,如果重复项出现在组中,则应使用 处理(unique如果需要):
any(duplicated(unlist(lapply(my_list, unique))))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
或其他基本 R替代方案
anyDuplicated(unlist(lapply(my_list, unique))) > 1
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
subset(stack(my_list), duplicated(values))$values
[1] "e"
Run Code Online (Sandbox Code Playgroud)
如果您需要判断一个组中的所有值对于该组是否是唯一的,您可以这样做:
result <- setNames(logical(length(my_list)), names(my_list))
result[unique(unlist(Filter(\(x)length(x)>1,
unstack(rev(stack(my_list))))))] <- TRUE
result
group1 group2 group3
TRUE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
甚至:
stack(my_list) %>%
mutate(dups = duplicated(values) | duplicated(values, f = T)) %>%
group_by(ind) %>%
summarise(logic = any(dups))
# A tibble: 3 x 2
ind logic
<fct> <lgl>
1 group1 TRUE
2 group2 TRUE
3 group3 FALSE
Run Code Online (Sandbox Code Playgroud)