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.
我非常感谢任何协助与此!
2条答案
按热度按时间0yycz8jy1#
正如@akrun已经在注解中指出的
select_if()
是不推荐使用的。我们可以select()
所有不以“M”开头的变量!starts_with("M")
,并且是数值型的和大于零的变量where(~ is.numeric(.x) && sum(.x) > 0)
。这里,双
&
运算符很重要。我们首先检查列是否为数字,只有在这种情况下,控制流才会检查sum
是否大于零。如果不这样做,我们将收到一个错误,即我们为sum()
提供了一个非数字变量。创建于2023年1月17日,使用reprex v2.0.2
8wtpewkr2#
我无法用select_if找到答案,但我尝试了另一种方法,请检查,此处删除了列“m3”,因为其值之和为零