返回仅在组中出现一次的观察结果

Bla*_*ake 2 grouping r dataframe

我试图通过因子变量对data.frame进行分组,然后返回data.frame的行,这些行与每个组中仅发生一次的观察值相对应。例如,考虑以下数据:

x = matrix(c(1,1,2,2,2,3,4,4,5,4), nrow = 5, ncol = 2, byrow = F)
x = data.frame(x)
x

#   X1 X2
# 1  1  3
# 2  1  4
# 3  2  4
# 4  2  5
# 5  2  4
Run Code Online (Sandbox Code Playgroud)

我想按第1列中的值对数据进行分组,然后返回一组中第2列中的值仅出现一次的行。在这里,该函数将返回第一,第二和第四行。

所需的输出

#   X1 X2
# 1  1  3
# 2  1  4
# 4  2  5
Run Code Online (Sandbox Code Playgroud)

我希望将其应用于具有> 1mm行的数据集。

A5C*_*2T1 5

在基数R中,您可以尝试ave

x[with(x, ave(X2, X1, X2, FUN = length)) == 1, ]
#   X1 X2
# 1  1  3
# 2  1  4
# 4  2  5
Run Code Online (Sandbox Code Playgroud)

因为ave在有多个组和多个分组变量时伸缩性很差,所以您可能需要首先创建一个新组:

x[with(x, ave(X2, sprintf("%s__%s", X1, X2), FUN = length)) == 1, ]
Run Code Online (Sandbox Code Playgroud)

速度将根据数据的性质而变化很大。

您也可以尝试:

library(dplyr)
x %>%
  group_by(X1, X2) %>%
  filter(n() == 1)
# Source: local data frame [3 x 2]
# Groups: X1, X2 [3]
# 
#      X1    X2
#   (dbl) (dbl)
# 1     1     3
# 2     1     4
# 3     2     5
Run Code Online (Sandbox Code Playgroud)