Dplyr filtresi (herhangi bir satırda)

Aug 18 2020

R dünyasında yeniyim, bu günlerde dplyr'ın filtre işleviyle ilgili sorun yaşıyorum. Bir df var ve bir sayıdan büyük değerleri filtrelemem gerekiyor, ancak bazı satırlarda birden çok değer var (ile ayrılmış; ). Örneğin bu df var

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

Filtrem, değer1'deki bir veya daha fazlasının 3'ten büyük veya eşit olmasıdır. Dplyr işlev filtresini kullanıyorum çünkü diğerlerinin df filtrelerini gerçekleştirmem gerekiyor. Bu benim kodum.

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

Ancak bu durumda, herhangi bir fonksiyon df'nin tüm değerlerini dikkate alır (düşündüğüm gibi satıra göre değil), bu nedenle, tüm df'yi aldım ve bu doğru değil.

Bu örnek için 1,2 ve 4 numaralı satırı elde etmem gerekiyor.

Sanırım satır bazında kontrol etmeli ve şuna göre ayırmalıyım; , ancak bunu dplyr'ın filtre işlevi ile nasıl yapacağımı bilmiyorum.

Çok teşekkürler!

Yanıtlar

1 akrun Aug 18 2020 at 02:00

Bir seçenek, 'değer1'i' separate_rowsden tidyr, 'ID'ye göre gruplandırarak ,' değer1'de 3'e eşit veya daha büyük öğeye filtersahip grupları any, ardından summarisesütunları pasteing ve first'değer2' öğesini alarak bölmek olabilir.

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

Ya kullanarak mapilestrsplit

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

veri

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