обновляйте имена на основе столбцов

#r #tidyverse

Вопрос:

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

В моем примере есть 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" amp; is.na(name2), "b", name3)) , но теперь NA появился. Есть какие-нибудь предложения по этому поводу?

Комментарии:

1. В вашем ожидаемом результате name1 == "a" есть FALSE name1 и то , и name2 NA другое , почему name3 изменилось?

2. Я просто хотел изменить вход b в name3 зависимости от условия, которое я хочу от name1 и. name2 Поскольку реальный набор данных настолько запутан, я хочу разделить несколько случаев, которые, по моему мнению, было бы неплохо решить. Вот почему я звоню a и НА от имени 1 и имени 2 соответственно

Ответ №1:

Основание R

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

dplyr

 library(dplyr)

df %>% 
  mutate(name3 = case_when(
    any(name1 == "a") amp; 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
 

Комментарии:

1. Большое спасибо за any это !

2. в любом случае, спасибо, что дали свой ответ. Это хорошо сработало, сэр.

Ответ №2:

Мы можем заменить == на %in% для устранения NAs, потому что R NA %in% x принимает значение FALSE, но NA==x на

 df %>% mutate(name3 = ifelse(name1 %in% 'a' amp; is.na(name2), 'b', name3)) 
 

Комментарии:

1. Я думаю, что это было в одно и то же время. 1

2. Отсчитано в ту же секунду! 1

3. да, и результат a b , которого мы не ожидаем, не является нашим ожиданием, верно

Ответ №3:

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

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

or:
df %>% 
  mutate(name3 = ifelse(any(name1 %in% "a") amp; 
                          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
 

Комментарии:

1. Я думаю b , что результат будет компенсировать a вместо этого правильно

2. Пожалуйста, ознакомьтесь с моим обновлением!