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_rows
fromtidyr
で分割し、「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))