如何在R中使用case_when语句指定一系列列范围来检查条件?

3

考虑到下列数据框:

library(tidyverse)
df <- mtcars %>% as_tibble() %>% slice(1:5)
df

# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2

我知道你可以使用类似于 df %>% select(c(mpg:vs)) 的方法来选择一段列,而不需要在 select 语句中打出所有的列名。那么,我要如何在 case_when 语句中做类似的操作呢?我的数据集有大约35个列,我想标记那些所有列的值都等于0的行。


你想要的期望输出并不是完全清楚的。是选择列还是其他什么。请注意,case_when 函数期望一个向量,即单个列,而不是多个列。 - akrun
2个回答

3
我们可以在select语句中使用where条件。
df %>%
   select(where(~ all(. %in% c(0, 1))))

-输出

# A tibble: 5 x 2
     vs    am
  <dbl> <dbl>
1     0     1
2     0     1
3     1     1
4     1     0
5     0     0

如果我们想要创建一个新的列"flag",用于检查特定行的所有列值是否都为0。
df %>%
    mutate(new = !rowSums(cur_data() != 0))

2

我不确定我们是否可以使用case_when来解决这个问题,但是我们可以使用以下解决方案:

library(dplyr)

df %>%
  rowwise() %>%
  mutate(flag = +(all(c_across(where(is.numeric)) == 0)))

# A tibble: 5 x 12
# Rowwise: 
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb  flag
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1  21       6   160   110  3.9   2.62  16.5     0     1     4     4     0
2  21       6   160   110  3.9   2.88  17.0     0     1     4     4     0
3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1     0
4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1     0
5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2     0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接