制作唯一的行并附加某些列的最小值
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_by
与summarise
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
我在 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_by
与summarise
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