dplyr 필터 (모든 행 포함)

Aug 18 2020

나는 R 세계에서 새로 왔으며 요즘 dplyr의 필터 기능에 문제가 있습니다. df와 a 숫자보다 큰 값을 필터링해야하지만 일부 행에는 여러 값이 있습니다 (; ). 예를 들어이 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보다 크거나 같은 경우입니다. 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

옵션은 'ID'로 그룹화 된 separate_rowsfrom으로 'value1'을 분할하고 'value1'의 요소가 3보다 크거나 같은 그룹 , 그런 다음 'value2' 의 요소 를 ing 및 가져 와서 열 을 분할하는 것입니다.tidyrfilteranysummarisepastefirst

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