我有一个数据表如下:
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 列的内容是否相同。
提前非常感谢您!
如果我理解正确,您可以尝试以下操作。
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