#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. Пожалуйста, ознакомьтесь с моим обновлением!