这个问题在这里已有答案:
我试图通过因子变量对data.frame进行分组,然后返回与 occur exactly once in each group 的观察对应的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
我想按照第1列中的值对数据进行分组,然后返回第2列中的值仅在组中出现一次的行 . 这里,函数将返回第一行,第二行和第四行 .
期望的输出
# X1 X2
# 1 1 3
# 2 1 4
# 4 2 5
我希望将其应用于行> 1mm的数据集 .
3 回答
在基数R中,您可以尝试
ave
:因为
ave
在有多个组和多个分组变量时非常差,所以您可能需要先创建一个新组:根据数据的性质,速度会有很大差异 .
你也可以尝试:
我们可以使用
data.table
. 我们将'data.frame'转换为'data.table'(setDT(x)
,按第一列分组,即"X1",if
,只有一个观察,返回行,否则删除所有重复项并仅返回唯一行 .如果我们同时使用“X1”和“X2”作为分组变量
注意:Data.table非常快且紧凑 .
或者不使用任何分组选项,我们可以使用
base R
或
tally
来自dplyr
请注意,这应该比其他dplyr解决方案更快 .
基准
Sample data
Base R approaches
dplyr approaches
data.table approaches
摘要:"data.table"方法胜出,但如果由于某种原因无法使用该程序包,则使用基础R中的
duplicated
也可以很好地执行 .有了基础,就像
其中
split
将x
拆分为data.frames列表,按X1
的级别拆分,然后lapply
子集划分为只有一次出现X2
值的行,由table
列表 .do.call(rbind
然后将生成的data.frames重新组合回一个 .