Filter dplyr (dengan salah satu baris)
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
Pilihannya adalah membagi 'nilai1' dengan separate_rows
dari tidyr
, dikelompokkan berdasarkan 'ID', filter
kelompok yang memiliki any
elemen dalam 'nilai1' lebih besar dari atau sama dengan 3, kemudian summarise
kolom dengan paste
memasukkan dan mendapatkan first
elemen '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 map
denganstrsplit
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))