Объединить два столбца из одного и того же фрейма данных в новый столбец в зависимости от состояния нулевых значений - PullRequest
0 голосов
/ 08 декабря 2018

Итак, вот мои данные:

colA    colB  
1       NA
2       3
3       4
4       NA

Я хочу использовать эти два столбца, чтобы создать новый столбец, объединяющий значения каждого из них.По сути, он будет принимать все значения из столбца B, но в случае нулевого значения он будет принимать значение из столбца A.Вывод будет выглядеть так:

colA   colB   newColumn
1      NA     1
2      3      3
3      4      4
4      NA     4

Мой код до сих пор выглядит так, но он сломал RStudio.Когда я набрал здесь свой вопрос, он буквально все еще работает:

for(i in 1:length(data$colB)){
  if(is.na(data$colB[i])){
  data$newColumn <- data$colA}
  else{
    data$newColumn <- data$colB
  }
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Функция dplyr::coalesce является сокращением для этого типа операции.Он работает с несколькими векторами, поэтому, если у вас есть colC, в котором также могут быть значения для направления, вы можете добавить это к вызову.Вы предоставляете векторы в порядке приоритета, поэтому он будет возвращать первое не NA значение, которое он видит.

data <- data.frame(
  colA = 1:4,
  colB = c(NA_integer_, 3L, 4L, NA_integer_)
)

data$new_column <- dplyr::coalesce(data$colB, data$colA)
data
#>   colA colB new_column
#> 1    1   NA          1
#> 2    2    3          3
#> 3    3    4          4
#> 4    4   NA          4
0 голосов
/ 08 декабря 2018

при условии, что ваши данные выглядят следующим образом:

options(stringsAsFactors = FALSE)
df1 <- read.table(text = "colA    colB  
1       NA
2       3
3       4
4       NA",header=1)

Один вкладыш решает вашу проблему, используя ifelse:

df1$newColumn <- ifelse(is.na(df1$colB), df1$colA, df1$colB)

, и ваша ошибка заключается в том, что вам нужно проиндексироватьзамены, поэтому вместо data$newColumn <- data$colA вы должны иметь data$newColumn[i] <- data$colA[i] и то же самое в операторе else.Но всегда лучше использовать векторизованные функции, такие как ifelse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...