我有一个有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中使用 by
和 tapply
:
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
基础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)])