【问题标题】:R- filter rows depending on value range across several columnsR-根据跨多列的值范围过滤行
【发布时间】:2022-01-14 10:24:32
【问题描述】:

我有 5 列包含数字数据,我想在 5 列中的至少 3 列中过滤与数据范围匹配的行。

例如,我有以下数据框,我定义了一个 5-10 的值范围。 我的第一行有 3 列,值在 5 到 10 之间,所以我想保留该行。 第二行只有 5 到 10 之间的 2 个值,所以我想删除它。

column1 column2 column3 column4 column5
7 4 10 9 2
4 8 2 6 2

【问题讨论】:

  • 欢迎来到 SO!请使用dput 提供您的数据集。

标签: r filter


【解决方案1】:

首先测试列中的值是否大于或等于 5 且小于或等于 10,然后查找符合条件的 3 或更多行。

dat[ rowSums( dat >= 5 & dat <= 10 ) >= 3, ]
  column1 column2 column3 column4 column5
1       7       4      10       9       2

数据

dat <- structure(list(column1 = c(7L, 4L), column2 = c(4L, 8L), column3 = c(10L, 
2L), column4 = c(9L, 6L), column5 = c(2, 2)), class = "data.frame", row.names = c(NA, 
-2L))

【讨论】:

  • 感谢您的帮助,我会努力申请的!
【解决方案2】:

我想分享第二种方法:

# Setting up data
my_df <- tibble::tibble(A = c(7,4), B = c(4,8), C = c(10, 2), D = c(9,6), E = c(2,2), X = c("some", "character"))
my_min <- 5
my_max <- 10

然后做一些 tidyverse-magic:

# This is verbose, but shows clearly all the steps involved:
my_df_filtered <- my_df %>% 
  dplyr::mutate(n_cols_in_range = dplyr::across(where(is.numeric), ~ .x >= my_min & .x <= my_max)
                ) %>%
  dplyr::rowwise() %>%
  dplyr::mutate(n_cols_in_range = sum(n_cols_in_range, na.rm = TRUE)
                ) %>%
  dplyr::filter(n_cols_in_range >= 3
                ) %>%
  dplyr::select(-n_cols_in_range)

以上等价于:

my_df_filtered <- my_df %>% 
  dplyr::rowwise() %>%
  dplyr::filter(sum(dplyr::across(where(is.numeric), ~ .x >= my_min & .x <= my_max), na.rm = TRUE) >= 3)

但我必须声明,上面的答案显然更优雅,因为它只需要 1 行代码!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 2016-11-25
    • 1970-01-01
    • 2020-02-15
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多