R 如何保持值只出现在一个组中?

R 如何保持值只出现在一个组中?,r,data-manipulation,R,Data Manipulation,我正在处理一个数据帧,如: groups . values a . 1 a . 1 a 2 b . 2 b . 3 b . 3 c . 4 c . 5 c . 6 d . 6 d . 7 d . 2 问题是要把它变成这样: groups . values a . 1 a . 1 b .

我正在处理一个数据帧,如:

groups .  values
a .        1
a .        1
a          2
b .        2
b .        3
b .        3
c .        4
c .        5
c .        6
d .        6
d .        7
d .        2
问题是要把它变成这样:

groups .  values
a .        1
a .        1
b .        3
b .        3
c .        4
c .        5
d .        7
我想保留其值仅出现在一个组中的行。例如,值2会被删除,因为它出现在三个不同的组中,但值1会被保留,尽管它只在一个组中出现两次

dplyr包中是否有任何函数可以处理此问题?或者我必须编写自己的函数?

按值分组,看看列组是否只有一个元素。这可以通过ave完成

在哪里

或者,data.table解决方案:

setDT(x)[, .SD[uniqueN(groups)==1], values]
df %>% group_by(values) %>% filter(n_distinct(groups) == 1)
# # A tibble: 7 x 2
# # Groups:   values [5]
# groups values
# <chr>   <int>
#1 a           1
#2 a           1
#3 b           3
#4 b           3
#5 c           4
#6 c           5
#7 d           7
对原始数据帧df使用sqldf包:

当您要求dplyr解决方案时:

setDT(x)[, .SD[uniqueN(groups)==1], values]
df %>% group_by(values) %>% filter(n_distinct(groups) == 1)
# # A tibble: 7 x 2
# # Groups:   values [5]
# groups values
# <chr>   <int>
#1 a           1
#2 a           1
#3 b           3
#4 b           3
#5 c           4
#6 c           5
#7 d           7


到目前为止,您有什么经验?我尝试了DATAFRAME%>%group\u bygroups%>%DistinctValue之类的方法,但它只保留每个组中唯一的值。
setDT(x)[, .SD[uniqueN(groups)==1], values]
library(sqldf)
result <- sqldf("SELECT * FROM df
                 WHERE `values` IN (
                     SELECT `values` from (
                         SELECT `values`, groups, count(*) as num from df
                         GROUP BY `values`, groups) t
                      GROUP BY `values` 
                      HAVING COUNT(1) = 1
                 )")   
df %>% group_by(values) %>% filter(n_distinct(groups) == 1)
# # A tibble: 7 x 2
# # Groups:   values [5]
# groups values
# <chr>   <int>
#1 a           1
#2 a           1
#3 b           3
#4 b           3
#5 c           4
#6 c           5
#7 d           7
df <- structure(list(groups = c("a", "a", "a", "b", "b", "b", "c", "c", "c", "d", "d", "d"),
                     values = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 5L, 6L, 6L, 7L, 2L)),
                row.names = c(NA, -12L), class = "data.frame")