Sütunların alt kümesinde eşleşen dizelere veya NA'ya göre, satır bazında mutasyon yapın
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_na
Tü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
Bir base R
seçenek ve verimli bir vektörleştirilmiş seçenek, rowSums
mantı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 rowwise
verimsiz 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