R语言 按变量筛选以允许返回所有行

00jrzges  于 2023-06-27  发布在  其他
关注(0)|答案(3)|浏览(113)

我有如下代码:

library(dplyr)
my_values <- rep(1:10, 10)
my_df <- data.frame(my_values, "points")

user_values <- c(2, 3)

filter(my_df, my_values %in% user_values)

用户提供某些值作为筛选依据。在某些情况下,过滤器不应处于“活动”状态,这意味着应保留所有值为“my_values”的行。

**我可以给user_values分配什么来实现这一点?**我尝试赋值NULL,但返回0行。赋值TRUE会将其强制为值1。

我知道我可以分配my_df$my_values(或unique(my_df$my_values)),但是当变量有数千个可能的值时,通过这种方式进行过滤可能需要很长时间。所以我在寻找一个更优雅的解决方案。

pbossiut

pbossiut1#

我会使用TRUE,因为它可以被理解为语义上的“一切”。NULL也是@Konrad指出的一个选项,最终它会分解为项目中的品味/整体惯例问题:

nrow(my_df)
# [1] 100

user_values <- c(2, 3)
my_df %>% 
   filter(isTRUE(user_values) | my_values %in% user_values) %>%
   nrow()
# [1] 20

user_values <- TRUE
my_df %>% 
   filter(isTRUE(user_values) | my_values %in% user_values) %>%
   nrow()
# [1] 100

user_values <- NULL
my_df %>% 
   filter(is.null(user_values) | my_values %in% user_values) %>%
   nrow()
# [1] 100
zz2j4svz

zz2j4svz2#

您可以在filter函数调用中使用if

filter(my_df, if(is.null(user_values)) TRUE else my_values %in% user_values)
rhfm7lfc

rhfm7lfc3#

一种可能性是测试user_valueslength。如果length是0,则返回所有,否则使用filter

if(length(user_values) > 0) filter(my_df, my_values %in% user_values) else my_df

或者,这也可以用在filter内部,如@thothal所示。

filter(my_df, length(user_values) == 0 | my_values %in% user_values)

或者将if条件放在filter中,如@Konrad Rudolph所示。

filter(my_df, if(length(user_values) == 0) TRUE else my_values %in% user_values)

user_values的以下设置将在这里给予my_df的所有行。

user_values <- c()
user_values <- logical()
user_values <- vector()
user_values <- character()
user_values <- numeric()
user_values <- NULL

相关问题