Sütunların alt kümesinde eşleşen dizelere veya NA'ya göre, satır bazında mutasyon yapın

Aug 19 2020

Bir satırdaki dizeleri birden çok sütun arasında nasıl eşleştireceğiniz konusunda herhangi bir tavsiyeniz var mı?

Tüm değişkenlerin NA olduğu, sütunlarda yalnızca NA'larla eşleştikleri dplyr kullanılarak ve bunları filtreleyerek - yeni bir değişken oluşturmadan , NA olan Kaldır satırlarından uyarlanmıştır .

Oyuncak örneği:

library(dplyr)
df <- tibble(a = c('a', 'a', 'a', NA), 
             b1 = c('b', 'c', NA, NA), 
             b2 = c('d', NA, NA, NA),
             b3 = c('e', NA, NA, NA),
             b4 = c('f', NA, NA, NA))
df

# A tibble: 4 x 5
  a     b1    b2    b3    b4   
  <chr> <chr> <chr> <chr> <chr>
1 a     b     d     e     f    
2 a     c     NA    NA    NA   
3 a     NA    NA    NA    NA   
4 NA    NA    NA    NA    NA 

all_naTüm satır NA ise yeni bir değişken oluşturmak için :

df %>% 
  rowwise() %>% 
  mutate(all_na = all(is.na(across())))


# A tibble: 4 x 6
# Rowwise: 
  a     b1    b2    b3    b4    all_na
  <chr> <chr> <chr> <chr> <chr> <lgl> 
1 a     b     d     e     f     FALSE 
2 a     c     NA    NA    NA    FALSE 
3 a     NA    NA    NA    NA    FALSE 
4 NA    NA    NA    NA    NA    TRUE   

Sütunların yalnızca bir alt kümesi ('b' ile başlayan) NA ise yeni bir değişken oluşturmak için b_is_na

df %>% 
  rowwise() %>% 
  mutate(b_is_na = all(is.na(across(starts_with('b'))))) %>% 
  ungroup()

# A tibble: 4 x 6
  a     b1    b2    b3    b4    b_is_na
  <chr> <chr> <chr> <chr> <chr> <lgl>  
1 a     b     d     e     f     FALSE  
2 a     c     NA    NA    NA    FALSE  
3 a     NA    NA    NA    NA    TRUE   
4 NA    NA    NA    NA    NA    TRUE   

Soru:

Bununla birlikte, bir sütun alt kümesi için bir satırın içindeyse bir değişkeni nasıl oluşturacağımı bilmiyorum NA, örneğin, bir sütun alt kümesi bir dizeyle eşleşiyor VEYA ,'c' or NA

Istenilen çıktı:

# A tibble: 4 x 6
  a     b1    b2    b3    b4    b_is_na
  <chr> <chr> <chr> <chr> <chr> <lgl>  
1 a     b     d     e     f     FALSE  
2 a     c     NA    NA    NA    TRUE  
3 a     NA    NA    NA    NA    TRUE   
4 NA    NA    NA    NA    NA    TRUE   

Yanıtlar

1 akrun Aug 19 2020 at 02:58

Bir base Rseçenek ve verimli bir vektörleştirilmiş seçenek, rowSumsmantıksalmatrix

nm1 <- startsWith(names(df), 'b')
df$b_is_na <- rowSums(df[nm1] == 'c'|is.na(df[nm1])) > 0 df$b_is_na
#[1] FALSE  TRUE  TRUE  TRUE

Ayrıca, mutate

library(dplyr)
df %>%
  mutate(b_is_na = rowSums(select(., starts_with('b')) == 
             'c'|is.na(select(., starts_with('b')))) > 0)
# A tibble: 4 x 6
#  a     b1    b2    b3    b4    b_is_na
#  <chr> <chr> <chr> <chr> <chr> <lgl>  
#1 a     b     d     e     f     FALSE  
#2 a     c     <NA>  <NA>  <NA>  TRUE   
#3 a     <NA>  <NA>  <NA>  <NA>  TRUE   
#4 <NA>  <NA>  <NA>  <NA>  <NA>  TRUE 

NOT: Kullanmak rowwiseverimsiz bir yol olacaktır

Veya bununla c_across, ama o kadar optimal olmayabilir

df %>% 
   rowwise %>%
   mutate(b_is_na = {
        tmp <- c_across(starts_with('b'))
         any(is.na(tmp)|tmp == 'c') }) %>%
   ungroup
# A tibble: 4 x 6
#  a     b1    b2    b3    b4    b_is_na
#  <chr> <chr> <chr> <chr> <chr> <lgl>  
#1 a     b     d     e     f     FALSE  
#2 a     c     <NA>  <NA>  <NA>  TRUE   
#3 a     <NA>  <NA>  <NA>  <NA>  TRUE   
#4 <NA>  <NA>  <NA>  <NA>  <NA>  TRUE