是否可以根据列中的任何值选择r中的列?



我想将我的df子集仅包含在任何行中包含特定值的列。

例如,如果我有:

year = c(1990,1991,1992,1993,1994,1995,1996,1997,1998,1999)
apple = c(1,4,6,8,9,9,2,4,7,4)
orange = c(7,1,5,5,2,1,7,1,3,8)
banana = c(9,9,4,8,1,3,6,7,5,9)
lemon = c(8,3,3,3,2,5,6,7,2,4)
df = data.frame(year,apple,orange,banana,lemon)
df

我想只选择列中任何地方有9的列,这样我的df将只包括苹果和香蕉列。

这可能吗?到目前为止,我找到的所有答案都只支持根据列名选择列,但我想根据列中的单元格值进行选择。谢谢你!

我们可以在where中传递select中的函数-检查列是否为数字,如果是数字,检查any的值是否等于9。另外可以将any(.x ==9)变为9 %in% .x

library(dplyr)
df %>% 
select(where(~is.numeric(.x) && any(.x == 9)))

与产出

apple banana
1      1      9
2      4      9
3      6      4
4      8      8
5      9      1
6      9      3
7      2      6
8      4      7
9      7      5
10     4      9

base Roption usingFilter:

Filter(function(x) any(x == 9), df)

输出:

apple banana
1      1      9
2      4      9
3      6      4
4      8      8
5      9      1
6      9      3
7      2      6
8      4      7
9      7      5
10     4      9

这个问题太长太啰嗦了,@akrun已经提供了完美的答案。因此,这里有一种替代方法:我们在这里做的是mutateacrossyear外的每一列检查它们是否包含9如果包含,然后将列的名称放入名为x的新列

any_ofselect同时使用

library(dplyr)
library(tidyr)
df %>% 
mutate(across(-year, ~case_when(. == 9 ~ cur_column()), .names = 'new_{col}')) %>%
unite(x, starts_with('new'), na.rm = TRUE, sep = ' ') %>% 
select(any_of(x))

banana apple
1       9     1
2       9     4
3       4     6
4       8     8
5       1     9
6       3     9
7       6     2
8       7     4
9       5     7
10      9     4

也许我们可以像下面这样使用colMeans,如果在列

中至少存在一个9,则平均值应该是非零的。
> df[colMeans(df == 9) > 0]
apple banana
1      1      9
2      4      9
3      6      4
4      8      8
5      9      1
6      9      3
7      2      6
8      4      7
9      7      5
10     4      9

相关内容

最新更新