一组中的 "所有 "值是否存在于任何其他组中?

问题描述 投票:1回答:2

我有一个有2列的数据框。第一列 "Alpha "是属于一个分组的一组值。该分组在 "Beta "列中被识别。

我需要的是一个函数循环,你有什么,可以通过所有的Beta组迭代。对于每个组,我想看看是否有任何其他组包含了不同组的A中的所有值,并将其删除。

例如:我的表

Alpha <- c('fred','bob','tom','julie','tom','fred','fred','julie')
Beta <- c('groupA','groupA','groupA','groupB','groupB','groupB','groupC','groupC')
df <- data.frame(Alpha,Beta)

我想发生的是,GroupC(fred和julie)也存在于GroupB中。

所以规则是 每一 某组中的值必须存在于另一组中,则另一组 可以 有更多的值,而不仅仅是第一组的值,但它不能有一些,它必须有所有的值。

我正在尝试删除多余的分组。

r grouping
2个回答
3
投票

这里有一个方法,在基础R中使用 bytapply :

all_data <- by(df$Alpha, df$Beta, function(x) 
                tapply(df$Alpha, df$Beta, function(y) all(x %in% y)))

all_data
#df$Beta: groupA
#groupA groupB groupC 
#  TRUE  FALSE  FALSE 
#---------------------------------------------------------------------
#df$Beta: groupB
#groupA groupB groupC 
# FALSE   TRUE  FALSE 
#---------------------------------------------------------------------
#df$Beta: groupC
#groupA groupB groupC 
# FALSE   TRUE   TRUE 

我们可以看到,在 'groupC' 满堂红 'groupB' 姑且不论 'groupC'.

total <- sapply(all_data, sum)
subset(df, !Beta %in% names(total[total > 1]))

#  Alpha   Beta
#1  fred groupA
#2   bob groupA
#3   tom groupA
#4 julie groupB
#5   tom groupB
#6  fred groupB

1
投票

基础R解决方案。

subset(df, df$Beta %in% df$Beta[grepl(paste0(Reduce(function(x,y){setdiff(x, y)}, 
       split(ordered_df$Alpha, ordered_df$Beta)), collapse = "|"), df$Alpha)])
© www.soinside.com 2019 - 2024. All rights reserved.