dplyr 필터 (모든 행 포함)
나는 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
옵션은 'ID'로 그룹화 된 separate_rows
from으로 'value1'을 분할하고 'value1'의 요소가 3보다 크거나 같은 그룹 , 그런 다음 'value2' 의 요소 를 ing 및 가져 와서 열 을 분할하는 것입니다.tidyr
filter
any
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))