我不太熟悉r中的dplyr函数,但是,我想将我的数据集过滤到某些条件。
假设我的数据集中有超过100个属性。并且我想执行具有多个条件的过滤器。
我可以把我的编码过滤器列的位置,而不是他们的名称,如下所示:
y = filter(retag, c(4:50) != 8 & c(90:110) == 8)
我已经尝试了几次类似的编码,但仍然没有得到结果。
我也尝试编码如下,但不确定如何添加另一个条件到rowsum函数。
retag[rowSums((retag!=8)[,c(4:50)])>=1,]
我发现的唯一的例子是使用数据集名称而不是位置。
或者是否有任何方法使用数据集位置作为我的数据相当大的过滤。
可以使用filter()
和across()
的组合。我没有你版本的retag
数据框架,所以我创建了我自己的作为一个例子
set.seed(2000)
retag <- tibble(
col1 = runif(n = 1000, min = 0, max = 10) %>% round(0),
col2 = runif(n = 1000, min = 0, max = 10) %>% round(0),
col3 = runif(n = 1000, min = 0, max = 10) %>% round(0),
col4 = runif(n = 1000, min = 0, max = 10) %>% round(0),
col5 = runif(n = 1000, min = 0, max = 10) %>% round(0)
)
# filter where the first, second, and third column all equal 5 and the fourth column does not equal 5
retag %>%
filter(
across(1:3, function(x) x == 5),
across(4, function(x) x != 5)
)
if_all()
和if_any()
最近被引入到tidyverse中,目的是过滤多个变量。
library(dplyr)
filter(retag, if_all(X:Y, ~ .x > 10 & .x < 35))
# # A tibble: 5 x 2
# X Y
# <int> <int>
# 1 11 30
# 2 12 31
# 3 13 32
# 4 14 33
# 5 15 34
filter(retag, if_any(X:Y, ~ .x == 2 | .x == 25))
# # A tibble: 2 x 2
# X Y
# <int> <int>
# 1 2 21
# 2 6 25
数据retag <- structure(list(X = 1:20, Y = 20:39), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame"))
这是一个基本R选项。
这将选择在列4到50中不存在8并且在列90到110中至少存在一个8的行。
result <- retag[rowSums(retag[4:50] == 8, na.rm = TRUE) == 0 &
rowSums(retag[90:110] == 8,na.rm = TRUE) > 0, ]