R语言 select_if使用第二个条件引发错误

6pp0gazn  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(211)
df <- data.frame(
 id = rep(letters[1:3], 9),
 m1 = ceiling(rnorm(9, 10, 3)),
 m2 = ceiling(rnorm(9, 10, 6)),
 m3 = 0
 )

head(df) 

 id m1 m2 m3
1  a 12 14  0
2  b 11  9  0
3  c 10 10  0
4  a 16  1  0
5  b  5 15  0
6  c  8  7  0

我有一个数据框,元数据位于最左边的列,原始数据矩阵连接到右侧。我希望使用dplyr::select_if删除数据框右侧总和为零的列,而不将其分解为两个单独的对象

df %>% 
  select_if(!(grepl("m",names(.)))) %>% 
  head()

  id
1  a
2  b
3  c
4  a
5  b
6  c

当我尝试添加第二个项来评估原始数据列(由“m”前缀指示)之和是否为零时,我得到以下错误消息:

> df %>% 
+   select_if(!(grepl("m",names(.))) || sum(.) > 0)

Error in `select_if()`:
! `.p` is invalid.
✖ `.p` should have the same size as the number of variables in the tibble.
ℹ `.p` is size 1.
ℹ The tibble has 4 columns, including the grouping variables.
Run `rlang::last_error()` to see where the error occurred.
Warning message:
In !(grepl("m", names(.))) || sum(.) > 0 :
  'length(x) = 4 > 1' in coercion to 'logical(1)'

> rlang::last_error()

<error/rlang_error>
Error in `select_if()`:
! `.p` is invalid.
✖ `.p` should have the same size as the number of variables in the tibble.
ℹ `.p` is size 1.
ℹ The tibble has 4 columns, including the grouping variables.

我非常感谢任何协助与此!

0yycz8jy

0yycz8jy1#

正如@akrun已经在注解中指出的select_if()是不推荐使用的。我们可以select()所有不以“M”开头的变量!starts_with("M"),并且是数值型的和大于零的变量where(~ is.numeric(.x) && sum(.x) > 0)
这里,双&运算符很重要。我们首先检查列是否为数字,只有在这种情况下,控制流才会检查sum是否大于零。如果不这样做,我们将收到一个错误,即我们为sum()提供了一个非数字变量。

library(dplyr)

df %>%
  select(!starts_with("M"),
         where(~ is.numeric(.x) && sum(.x) > 0))

#>    id m1 m2
#> 1   a 12 18
#> 2   b 13 24
#> 3   c  6 12
#> 4   a 11  8
#> 5   b  9  0
#> 6   c 12  2
#> 7   a 11  9
#> 8   b 12  4
#> 9   c  4  8
#> 10  a 12 18
#> 11  b 13 24
#> 12  c  6 12
#> 13  a 11  8
#> 14  b  9  0
#> 15  c 12  2
#> 16  a 11  9
#> 17  b 12  4
#> 18  c  4  8
#> 19  a 12 18
#> 20  b 13 24
#> 21  c  6 12
#> 22  a 11  8
#> 23  b  9  0
#> 24  c 12  2
#> 25  a 11  9
#> 26  b 12  4
#> 27  c  4  8

创建于2023年1月17日,使用reprex v2.0.2

8wtpewkr

8wtpewkr2#

我无法用select_if找到答案,但我尝试了另一种方法,请检查,此处删除了列“m3”,因为其值之和为零

# get the list of columns with numeric data
vec <- names(select_if(df, is.numeric))
# get the list of columns which do not sum to zero
vec2 <- vec[which(apply(df[,vec], 2, sum)!=0)]
# then use that vector to select the columns
df %>% select(id, vec2)

相关问题