Filter dplyr (dengan salah satu baris)

Aug 18 2020

Saya baru di dunia R, akhir-akhir ini saya memiliki masalah dengan fungsi filter dplyr. Saya memiliki df dan saya perlu memfilter nilai yang lebih besar dari angka, tetapi di beberapa baris saya memiliki nilai kelipatan (dipisahkan oleh; ). Misalnya saya punya df ini

ID   value1    value2
1    1;0;3.4    4
2    3          5
3    0.5;2;1.3  0
4    5;0.1      3

Filter saya adalah jika satu atau lebih nilai1 lebih besar atau sama dari 3. Saya menggunakan filter fungsi dplyr karena saya perlu menyadari filter lain ke df. Ini kode saya.

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

Tetapi dalam hal ini fungsi apa pun mempertimbangkan semua nilai df (bukan per baris, seperti yang saya pikirkan), jadi, saya obtein semua df dan itu tidak benar.

Saya perlu mendapatkan baris dengan id 1,2 dan 4 untuk contoh ini.

Saya pikir saya harus memeriksa per baris dan memisahkan dengan; , tapi saya tidak tahu bagaimana melakukan ini dengan fungsi filter dplyr.

Terima kasih banyak!

Jawaban

1 akrun Aug 18 2020 at 02:00

Pilihannya adalah membagi 'nilai1' dengan separate_rowsdari tidyr, dikelompokkan berdasarkan 'ID', filterkelompok yang memiliki anyelemen dalam 'nilai1' lebih besar dari atau sama dengan 3, kemudian summarisekolom dengan pastememasukkan dan mendapatkan firstelemen 'nilai2'

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

Atau menggunakan mapdenganstrsplit

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

data

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