R 语言如何找到数据框中每一行的最小值?

R 语言如何找到数据框中每一行的最小值?针对这个问题,首先我们创建一个示例数据:

library(tidyverse)
tibble(x = c(1, 2, 3),
y = c(3, 1, 2),
z = c(1, 2, 4)) -> df

行运算通常需要转换成长数据之后再进行分组运算:

df %>%
mutate(id = row_number()) %>%
gather(x:z, key = "key", value = "value") %>%
group_by(id) %>%
mutate(min = min(value, na.rm = T)) %>%
spread(key, value)

#> # A tibble: 3 × 5
#> # Groups: id [3]
#> id min x y z
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 1 3 1
#> 2 2 1 2 1 2
#> 3 3 2 3 2 4

不过 dplyr 包也提供了直接运行行运算的操作:

df %>%
rowwise() %>%
mutate(min = min(c(x, y, z))) %>%
as_tibble()

#> # A tibble: 3 × 4
#> x y z min
#> <dbl> <dbl> <dbl> <dbl>
#> 1 1 3 1 1
#> 2 2 1 2 1
#> 3 3 2 4 2

要进行运算的变量比较多的时候也可以是有 c_across() 辅助:

df %>%
rowwise() %>%
mutate(min = min(c_across(x:z))) %>%
as_tibble()

#> # A tibble: 3 × 4
#> x y z min
#> <dbl> <dbl> <dbl> <dbl>
#> 1 1 3 1 1
#> 2 2 1 2 1
#> 3 3 2 4 2

有时候我们希望生成的新列不是最小值,而是到底是哪个变量最小,可以这样:

df %>%
mutate(id = row_number()) %>%
gather(x:z, key = "key", value = "value") %>%
group_by(id) %>%
mutate(min = min(value, na.rm = T)) %>%
mutate(mingroup = if_else(value == min, key, "")) %>%
type_convert() %>%
fill(mingroup, .direction = "updown") %>%
spread(key, value)
#> # A tibble: 4 × 6
#> # Groups: id [3]
#> id min mingroup x y z
#> <int> <dbl> <chr> <dbl> <dbl> <dbl>
#> 1 1 1 x 1 NA NA
#> 2 1 1 z NA 3 1
#> 3 2 1 y 2 1 2
#> 4 3 2 y 3 2 4

这里第一行的 x 和 z 变量都是最小值,所以对应两行。

点击这里跳转到 RStata 短书平台获取附件:R 语言如何找到数据框中每一行的最小值?

评论