Я хочу обновить имена на основе двух столбцов

В моем примере 3 исходных столбца

df <- data.frame(name1 = c("a", "a", "a", "a", 'a', NA, NA, NA),
                 name2 = c("b", "b", "b", "b", "c", NA, NA, NA),
                 name3 = c("b", "b", "b", "b", "c", "a", "a", "a"))

df
  name1 name2 name3
1     a     b     b
2     a     b     b
3     a     b     b
4     a     b     b
5     a     c     c
6  <NA>  <NA>     a
7  <NA>  <NA>     a
8  <NA>  <NA>     a

Я хотел бы обновить столбец name3 (или даже создать новый столбец), сказав, что если name1 == a и name2 == NA, то символ a в name3 будет заменен на b в столбце name2.

Мой желаемый результат что-то вроде

  name1 name2 name3
1     a     b     b
2     a     b     b
3     a     b     b
4     a     b     b
5     a     c     c
6  <NA>  <NA>     b
7  <NA>  <NA>     b
8  <NA>  <NA>     b

Пока я использую этот df %>% mutate(name3 = ifelse(name1 == "a" & is.na(name2), "b", name3)), но теперь появился NA. Есть предложения по этому поводу?

1
Anh 11 Окт 2021 в 22:17

3 ответа

Лучший ответ

База R

df$name3 <- ifelse(any(df$name1 == "a") & is.na(df$name2), "b", df$name3)

dplyr

library(dplyr)

df %>% 
  mutate(name3 = case_when(
    any(name1 == "a") & is.na(name2) ~ "b",
    TRUE ~ name3
  ))
#  name1 name2 name3
#1     a     b     b
#2     a     b     b
#3     a     b     b
#4     a     b     b
#5     a     c     c
#6  <NA>  <NA>     b
#7  <NA>  <NA>     b
#8  <NA>  <NA>     b
2
Rui Barradas 11 Окт 2021 в 19:31

Мы можем заменить == на %in%, чтобы исключить NA, потому что R оценивает NA %in% x как FALSE, но NA==x как NA

df %>% mutate(name3 = ifelse(name1 %in% 'a' & is.na(name2), 'b', name3)) 
2
GuedesBF 11 Окт 2021 в 19:24

Мы могли бы использовать оператор case_when или ifelse:

library(dplyr)
df %>% 
  mutate(name3 = case_when(any(name1 %in% "a") &
                             is.na(name2) ~ "b",
                           TRUE ~ name3))

or:
df %>% 
  mutate(name3 = ifelse(any(name1 %in% "a") & 
                          is.na(name2), "b", name3))
        
  name1 name2 name3
1     a     b     b
2     a     b     b
3     a     b     b
4     a     b     b
5     a     c     c
6  <NA>  <NA>     b
7  <NA>  <NA>     b
8  <NA>  <NA>     b
2
TarJae 11 Окт 2021 в 19:34