识别多列中具有相同值的行对或行组

Par*_*gue 6 r dplyr

假设我有一个数据框:

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,但他们并没有完全理解这个用例。

akr*_*run 7

我们需要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)


Tar*_*Jae 7

另一种方法:

这里所有超过 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)

  • 您还可以添加“arrange(.by_group = T)”吗? (2认同)