ตัวกรอง 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

ตัวกรองของฉันคือถ้าอย่างน้อยหนึ่งค่า 1 มากกว่าหรือเท่ากับ 3 ฉันใช้ตัวกรองฟังก์ชันของ dplyr เพราะฉันต้องการให้ผู้อื่นใช้ตัวกรอง df นี่คือรหัสของฉัน

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

แต่ในกรณีนี้ฟังก์ชันใด ๆ จะพิจารณาค่าทั้งหมดของ df (ไม่ใช่ตามแถวอย่างที่ฉันคิด) ดังนั้นฉันจึง obtein df ทั้งหมดและนั่นไม่ถูกต้อง

ฉันต้องการรับแถวที่มี id 1,2 และ 4 สำหรับตัวอย่างนี้

ฉันคิดว่าฉันควรตรวจสอบตามแถวและแยกตาม; แต่ฉันไม่รู้ว่าจะทำอย่างไรกับฟังก์ชันตัวกรองของ dplyr

ขอบคุณมาก!

คำตอบ

1 akrun Aug 18 2020 at 02:00

ตัวเลือกคือการแบ่ง 'value1' ด้วยseparate_rowsfrom tidyr, จัดกลุ่มตาม 'ID', filterกลุ่มที่มีanyองค์ประกอบใน 'value1' มากกว่าหรือเท่ากับ 3 จากนั้นsummariseคอลัมน์โดยpasteing และรับ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))