【问题标题】:Filter of dplyr (with any of rows)dplyr 的过滤器(带有任何行)
【发布时间】:2020-08-17 18:58:49
【问题描述】:

我是 R 世界的新手,这些天我对 dplyr 的过滤功能有疑问。我有一个 df 和一个我需要过滤大于数字的值,但在某些行中我有多个值(由 ; 分隔。 例如我有这个df

ID   value1    value2
1    1;0;3.4    4
2    3          5
3    0.5;2;1.3  0
4    5;0.1      3

我的过滤器是 value1 中的一个或多个是否大于或等于 3。我使用 dplyr 的功能过滤器,因为我需要实现其他过滤器到 df。这是我的代码。

filt <- df %>% filter(any(as.numeric(unlist(strsplit(value1,';',fixed=TRUE))) >=3))

但在这种情况下,any 函数会考虑 df 的所有值(而不是像我想的那样按行),所以,我获得了所有 df,这是不正确的。

对于这个例子,我需要获取 id 为 1,2 和 4 的行。

我认为我应该按行检查并按 ; 分隔,但是我不知道如何使用dplyr的过滤功能来做到这一点。

非常感谢!

【问题讨论】:

  • 在过滤器之前使用rowwise(),以便逐行进行处理,或者更好的是,使用tidyr::separate_rows之类的东西将数据转换为更“整洁”的格式
  • 哦,谢谢!我真的很喜欢这个解决方案!

标签: r dplyr


【解决方案1】:

一种选择是将“value1”与separate_rowstidyr 中拆分,按“ID”分组,filter 组在“value1”中的any 元素大于或等于3,然后@ 987654325@ 列由pasteing 并获得'value2' 的first 元素

library(dplyr)
library(tidyr)
df %>%
    separate_rows(value1, sep = ";", convert = TRUE) %>%
    group_by(ID) %>%
    filter(any(value1 >=3)) %>%
    summarise(value1 = str_c(value1, collapse=";"), value2 = first(value2))
# A tibble: 3 x 3
#     ID value1  value2
#  <int> <chr>    <int>
#1     1 1;0;3.4      4
#2     2 3            5
#3     4 5;0.1        3

或者使用mapstrsplit

library(purrr)
df %>% 
   filter(map_lgl(strsplit(value1, ";"), ~ any(as.numeric(.x) >=3)))
#   ID  value1 value2
#1  1 1;0;3.4      4
#2  2       3      5
#3  4   5;0.1      3

数据

df <- structure(list(ID = 1:4, value1 = c("1;0;3.4", "3", "0.5;2;1.3", 
"5;0.1"), value2 = c(4L, 5L, 0L, 3L)), class = "data.frame", row.names = c(NA, 
-4L))       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多