如何在 R tibble 中找到至少一半元素中共有的元素
How to find elements common in at least half of elements in an R tibble
我有一些价值观:
raw = tibble(
labels = rep(rep(1:4,each=3),2),
group = rep(c("A","B"), each=12),
value = c(1,2,3,3,4,5,6,7,2,2,12,1,7,3,3,3,4,5,6,3,2,2,7,1))
我想 select 为每个组 A 和 B seperatlty 在至少一半的标签中使用公共值。结果可能是
Res = tibble(group = c("A","B"),
value = c("1,2,3","2,3,7"))
如果我能找到一个灵活的函数来对至少 1/3 的标签执行相同的 selection,那将会很有帮助。
这是一个选项,我们按 'group'、'value' 进行分组,获取不同 'labels' 的数量,然后按 'group' 和 filter
'n' 大于或等于不同 'labels' 的数量乘以 2 即 50% 的行,得到 'group' 的 distinct
行,'value'
library(dplyr)
raw %>%
group_by(group, value) %>%
mutate(n = n_distinct(labels)) %>%
group_by(group) %>%
filter(n >= n_distinct(labels)/2) %>%
select(-n) %>%
ungroup %>%
distinct(group, value)
# A tibble: 6 x 2
# group value
# <chr> <dbl>
#1 A 1
#2 A 2
#3 A 3
#4 B 7
#5 B 3
#6 B 2
我有一些价值观:
raw = tibble(
labels = rep(rep(1:4,each=3),2),
group = rep(c("A","B"), each=12),
value = c(1,2,3,3,4,5,6,7,2,2,12,1,7,3,3,3,4,5,6,3,2,2,7,1))
我想 select 为每个组 A 和 B seperatlty 在至少一半的标签中使用公共值。结果可能是
Res = tibble(group = c("A","B"),
value = c("1,2,3","2,3,7"))
如果我能找到一个灵活的函数来对至少 1/3 的标签执行相同的 selection,那将会很有帮助。
这是一个选项,我们按 'group'、'value' 进行分组,获取不同 'labels' 的数量,然后按 'group' 和 filter
'n' 大于或等于不同 'labels' 的数量乘以 2 即 50% 的行,得到 'group' 的 distinct
行,'value'
library(dplyr)
raw %>%
group_by(group, value) %>%
mutate(n = n_distinct(labels)) %>%
group_by(group) %>%
filter(n >= n_distinct(labels)/2) %>%
select(-n) %>%
ungroup %>%
distinct(group, value)
# A tibble: 6 x 2
# group value
# <chr> <dbl>
#1 A 1
#2 A 2
#3 A 3
#4 B 7
#5 B 3
#6 B 2