制作唯一的行并附加某些列的最小值

make unique rows and append min value of some columns

我在 R 上有一个数据框。我想根据前三列获取唯一行,并在每个唯一行中附加第 4 列的最小值。

dat <- tibble(
  x = c("a", "a", "k", "k"),
  y = c("a", "a", "l", "l"),
  z = c("e", "e", "m" ,"m"),
  t = c("4", "3", "8" ,"9"))

下面是我想看的

x y z t
a a e 3
k l m 8

我相信有一种非常简单的方法可以做到这一点,但我当时看不到它。

我们可以调用 apply() 来查找 dat 中每行 的唯一行值 。然后,我们可以使用 duplicated() 查找重复项并使用否定 ! 到 return 行 not 重复项。我们使用 which 获取与 dat 重复的行对应的整数。最后,使用这些整数 (unique_rows) 从 dat 中提取唯一行。因此,我们不必 append.

unique_rows <- which(!duplicated(apply(dat[, 1:3], 1, unique)))
out <- dat[unique_rows, ]

输出

> out
  x y z t
1 a a e 4
3 k l m 8

tidyverse一起使用group_bysummarise

library(dplyr)
dat %>%
  group_by(across(x:z)) %>% 
  summarise(t = min(t), .groups = 'drop')

-输出

# A tibble: 2 × 4
  x     y     z     t    
  <chr> <chr> <chr> <chr>
1 a     a     e     3    
2 k     l     m     8    

或者执行 arrange 并使用 distinct

dat %>%
  arrange(across(everything())) %>%
  distinct(across(x:z), .keep_all = TRUE)
# A tibble: 2 × 4
  x     y     z     t    
  <chr> <chr> <chr> <chr>
1 a     a     e     3    
2 k     l     m     8    

另一种处理此问题的方法是取 t 列的最小值,并在 aggregate 函数中将剩余列作为组保留。

aggregate(t~., dat, min)

#  x y z t
#1 a a e 3
#2 k l m 8