Объединить два вектора в один в R

#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" , то измените

  1. A == "NA" Для is.na(A)
  2. temp != "NA" Для !is.na(temp)