按列对数据进行分组,并检查各组中指定列的内容是否相同

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

我有一个数据表如下:

example_data <- data.table(
  group_number = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4),
  A = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
  B = c(5, 6, 7, 8, 5, 6, 7, 8, 13, 14, 15, 16, 21, 22, 23, 24),
  other_columns = c(-0.03821019, -1.65126924, 0.26851449, -0.95818859,
                    0.51500988, 1.01449388, -0.65350743, -0.26931109,
                    1.04377564, 0.36648139, 2.47164652, -0.49508173,
                    0.53431890, -0.35798755, 0.38692761, 0.62482005)
)

在这里,我想首先按 group_number 对行进行分组。然后,如果一组的 A 列和 B 列的行与另一组的 A 列和 B 列的行相同,那么我想删除重复的组并只留下一组。

例如,在上表中,由于 group_number==1 中 A 列和 B 列的行与 group_number==2 中 A 列和 B 列的行相同,因此我想删除属于 group_number 2 的所有行(第 5:8 行)。

所需的输出应如下所示:

example_data <- data.table(
  group_number = c(1, 1, 1, 1, 3, 3, 3, 3, 4, 4, 4, 4),
  A = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
  B = c(5, 6, 7, 8, 13, 14, 15, 16, 21, 22, 23, 24),
  other_columns = c(-0.03821019, -1.65126924, 0.26851449, -0.95818859,
                    1.04377564, 0.36648139, 2.47164652, -0.49508173,
                    0.53431890, -0.35798755, 0.38692761, 0.62482005)
)

这项工作可以使用

distinct(example_data,A,B,.keep_all = TRUE)
来完成,但这不是我正在寻找的答案。 Distinct 函数按 A 列和 B 列的组合对数据进行分组,然后查看该组中是否存在重复值。我想按 group_number 进行分组,并检查 group_number 中 A 列和 B 列的内容是否相同。

提前非常感谢您!

r group-by duplicates grouping distinct
1个回答
0
投票

如果我理解正确,您可以尝试以下操作。

split
将 data.table 转换为基于
group_number
的列表。然后,您可以根据列
A
B
提取不重复的行。请注意,在
lapply
中,我们使用
[
来提取行,并有一个空参数来指示应包含所有行(并选择
A
B
列)。

lst <- split(example_data, example_data$group_number)
do.call(rbind, lst[!duplicated(lapply(lst, `[`, , c("A", "B")))])

输出

    group_number A  B other_columns
 1:            1 1  5   -0.03821019
 2:            1 2  6   -1.65126924
 3:            1 3  7    0.26851449
 4:            1 4  8   -0.95818859
 5:            3 1 13    1.04377564
 6:            3 2 14    0.36648139
 7:            3 3 15    2.47164652
 8:            3 4 16   -0.49508173
 9:            4 1 21    0.53431890
10:            4 2 22   -0.35798755
11:            4 3 23    0.38692761
12:            4 4 24    0.62482005
© www.soinside.com 2019 - 2024. All rights reserved.