我想将我的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 R
option 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已经提供了完美的答案。因此,这里有一种替代方法:我们在这里做的是mutate
across
除year
外的每一列检查它们是否包含9
如果包含,然后将列的名称放入名为x
的新列
则any_of
与select
同时使用
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