dplyrのフィルター(任意の行を含む)

Aug 18 2020

私は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の1つ以上が3以上の場合です。dfに対する他のフィルターを実現する必要があるため、dplyrの関数フィルターを使用します。これは私のコードです。

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

しかし、この場合、any関数はdfのすべての値を考慮します(私が思ったように行ごとではありません)ので、私はすべてのdfを取得しますが、それは正しくありません。

この例では、IDが1、2、4の行を取得する必要があります。

行ごとに確認し、;で区切る必要があると思います。、しかし、dplyrのフィルター機能でこれを行う方法がわかりません。

本当にありがとう!

回答

1 akrun Aug 18 2020 at 02:00

オプションは、「value1」をseparate_rowsfromtidyrで分割し、「ID」でfilterグループ化しany、「value1」の要素が3以上のグループを分割し、「value2」の要素をingして取得することでsummarise列を分割pasteすることです。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

またはで使用mapするstrsplit

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))