R语言 如果多列中的值满足阈值条件,则添加列计数:右

s2j5cfk0  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(104)

考虑iris数据集,假设我想创建一个列count,如果“sepal”列的值在1到5之间。
这是我的想法

iris %>% rowwise() %>%
  mutate(count = sum(if_any(contains("sepal", ignore.case = TRUE), 
                        .fns = ~ between(.x, 1, 5)))) %>%
  arrange(desc(count))

但是输出不是我想要的。

Sepal.Length Sepal.Width Petal.Length Petal.Width Species count
          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <int>
 1          5.1         3.5          1.4         0.2 setosa      1 # Should be 1
 2          4.9         3            1.4         0.2 setosa      1 # Should be 2
 3          4.7         3.2          1.3         0.2 setosa      1 # Should be 2
 4          4.6         3.1          1.5         0.2 setosa      1 # Should be 2
 5          5           3.6          1.4         0.2 setosa      1 # Should be 2
 6          5.4         3.9          1.7         0.4 setosa      1 # Should be 1
 7          4.6         3.4          1.4         0.3 setosa      1 # Should be 2
 8          5           3.4          1.5         0.2 setosa      1 # Should be 2
 9          4.4         2.9          1.4         0.2 setosa      1 # Should be 2
10          4.9         3.1          1.5         0.1 setosa      1 # Should be 2

我可以对这两列使用case_whenif_else,但 * 实际数据集的列要多得多。* 因此,我正在寻找一个dplyr解决方案,在该解决方案中,我不必键入所有列。

e4yzc0pl

e4yzc0pl1#

library(tidyverse)

iris %>% 
  mutate(
    count = rowSums(across(contains("Sepal"), ~ between(.x, 1, 5)))
  )

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species count
1            5.1         3.5          1.4         0.2     setosa     1
2            4.9         3.0          1.4         0.2     setosa     2
3            4.7         3.2          1.3         0.2     setosa     2
4            4.6         3.1          1.5         0.2     setosa     2
5            5.0         3.6          1.4         0.2     setosa     2
6            5.4         3.9          1.7         0.4     setosa     1
7            4.6         3.4          1.4         0.3     setosa     2
8            5.0         3.4          1.5         0.2     setosa     2
9            4.4         2.9          1.4         0.2     setosa     2
10           4.9         3.1          1.5         0.1     setosa     2

编辑:
以我的理解,c_across必须与rowwise()一起使用才能进行行聚合和计算。

iris %>%
  rowwise() %>%
  mutate(count = sum(between(c_across(contains("Sepal")), 1, 5)))

相关问题