#r #vector #merge #character #missing-data
#r #вектор #объединить #символ #отсутствуют данные
Вопрос:
Я хотел бы объединить два символьных вектора в один по следующей логике:
A <- c("005", "NA", "100", "NA")
B <- c("005", "NA", "NA", "257")
C <- c("005", "NA", "100", "257")
Допустим, у меня есть vector A
и B
, и я хочу объединить их таким образом, чтобы получить vector C
, как я могу этого добиться?
Комментарии:
1. Какова логика сравнения? Почему эти числа хранятся в виде строк? Каким будет ваш результат, если у вас есть два разных числа в
A
иB
?2. Эти числа являются идентификаторами из двух разных фреймов данных и обозначают определенный бренд соответственно. Однако, есть некоторые отсутствующие значения (нет идентификатора для данного бренда). Тем не менее, я хочу сохранить их. У меня есть два списка (A и B), и я хотел бы сохранить список A таким, какой он есть, но заполнить NAS A заданными значениями B, если таковые имеются — в данном случае «257».
3. Обратите внимание, что
"NA"
иNA
— это не одно и то же.4. В данном случае я говорю о NAs -> извините за путаницу!
Ответ №1:
Мы можем использовать coalesce
из dplyr
пакета, но обратите внимание, что вам нужно заменить «NA» на NA
, поскольку в R они разные. Здесь я преобразую оба A
и B
в числовые, чтобы добиться этого.
library(dplyr)
A <- c("005", "NA", "100", "NA")
B <- c("005", "NA", "NA", "257")
A <- as.numeric(A)
B <- as.numeric(B)
coalesce(A, B)
# [1] 5 NA 100 257
Комментарии:
1. Я полагаю,
as.numeric
можно заменить чем-то вродеfoo = function(x) replace(x, x == "NA", NA)
2. @d.b Я согласен с вами. Опасность использования
as.numeric
along заключается в том, что если есть другие символы, такие как «ниже» или «выше», они тоже станутNA
, что может быть не тем, чего хочет OP. Но я решил сохранитьas.numeric
здесь как возможность продемонстрировать поведение этой функции и как сравнение других ответов. Спасибо за ваши комментарии.
Ответ №2:
Вы могли бы сделать
C <- A
C[A == "NA"] <- B[A == "NA"]
C
#[1] "005" "NA" "100" "257"
Ответ №3:
replace(A, A == "NA", B[A == "NA"])
#[1] "005" "NA" "100" "257"
или
temp = cbind(A, B)
temp[cbind(seq_along(A),
match(colnames(temp)[max.col(temp != "NA")], colnames(temp)))]
#[1] "005" "NA" "100" "257"
Если у вас есть NA
в отличие от "NA"
, то измените
A == "NA"
Дляis.na(A)
temp != "NA"
Для!is.na(temp)