假设我有一个数据框:
file = read.table(text = "sex age num
M 32 5
F 31 2
M 91 2
M 30 1
M 23 1
F 19 1
F 31 2
F 21 2
M 32 5
F 65 3
M 24 5", header = T, sep = "")
Run Code Online (Sandbox Code Playgroud)
我想要获得所有行的排序数据框,这些行具有与数据框中的任何其他行完全相同的sex、age、 和值。num
结果应如下所示(请注意,数据框按彼此重复的对或组排序):
result = read.table(text = "sex age num
M 32 5
M 32 5
F 31 2
F 31 2", header = T, sep = "")
Run Code Online (Sandbox Code Playgroud)
我尝试了distinctdplyr 和的各种组合duplicated,但他们并没有完全理解这个用例。
我们需要duplicated两次,即一次duplicated在正常方向上从上到下,第二次从下到上(fromLast = TRUE),然后使用|,以便它在任一方向上都可以为 TRUE 进行子集化
out <- file[duplicated(file)|duplicated(file, fromLast = TRUE),]
out$sex <- factor(out$sex, levels = c("M", "F"))
out1 <- out[do.call(order, out),]
row.names(out1) <- NULL
Run Code Online (Sandbox Code Playgroud)
-输出
> out1
sex age num
1 M 32 5
2 M 32 5
3 F 31 2
4 F 31 2
Run Code Online (Sandbox Code Playgroud)
上面的内容可以写成tidyverse
library(dplyr)
file %>%
arrange(sex == "F", across(everything())) %>%
filter(duplicated(.)|duplicated(., fromLast = TRUE))
sex age num
1 M 32 5
2 M 32 5
3 F 31 2
4 F 31 2
Run Code Online (Sandbox Code Playgroud)
另一种方法:
这里所有超过 1 nrow 的组都将被保留:
library(dplyr)
file %>%
group_by(sex, age, num) %>%
filter(n() > 1) %>%
arrange(.by_group = T)
ungroup()
Run Code Online (Sandbox Code Playgroud)
sex age num
<chr> <int> <int>
1 F 31 2
2 F 31 2
3 M 32 5
4 M 32 5
Run Code Online (Sandbox Code Playgroud)