ตัวกรอง dplyr (ด้วยแถวใดก็ได้)
ฉันใหม่ในโลก 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
ตัวกรองของฉันคือถ้าอย่างน้อยหนึ่งค่า 1 มากกว่าหรือเท่ากับ 3 ฉันใช้ตัวกรองฟังก์ชันของ dplyr เพราะฉันต้องการให้ผู้อื่นใช้ตัวกรอง df นี่คือรหัสของฉัน
filt <- df %>% filter(any(as.numeric(unlist(strsplit(value1,';',fixed=TRUE))) >=3))
แต่ในกรณีนี้ฟังก์ชันใด ๆ จะพิจารณาค่าทั้งหมดของ df (ไม่ใช่ตามแถวอย่างที่ฉันคิด) ดังนั้นฉันจึง obtein df ทั้งหมดและนั่นไม่ถูกต้อง
ฉันต้องการรับแถวที่มี id 1,2 และ 4 สำหรับตัวอย่างนี้
ฉันคิดว่าฉันควรตรวจสอบตามแถวและแยกตาม; แต่ฉันไม่รู้ว่าจะทำอย่างไรกับฟังก์ชันตัวกรองของ dplyr
ขอบคุณมาก!
คำตอบ
ตัวเลือกคือการแบ่ง 'value1' ด้วยseparate_rows
from tidyr
, จัดกลุ่มตาม 'ID', filter
กลุ่มที่มีany
องค์ประกอบใน 'value1' มากกว่าหรือเท่ากับ 3 จากนั้นsummarise
คอลัมน์โดยpaste
ing และรับfirst
องค์ประกอบของ 'value2'
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))