Объединение многих столбцов в один столбец - PullRequest
1 голос
/ 15 января 2020

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

У меня есть фрейм данных с пятью столбцами и 6 строками (на самом деле они и многое другое, просто пытаясь упростить вопросы):

One Two Three   Four    Five
Cat NA  NA  NA  NA
NA  Dog NA  NA  NA
NA  NA  NA  Mouse   NA
Cat NA  Rat NA  NA
Horse   NA  NA  NA  NA
NA NA NA NA NA

Теперь я хотел бы объединить всю информацию в новом отдельном столбце («Сводка»), например:

Summary
Cat
Dog
Mouse
Error
Horse
NA

Обратите внимание, что в четвертой строке «Сводка» появилось сообщение «Ошибка», поскольку во время слияния было сообщено о двух разных значениях. Также обратите внимание, что в случае, если в строке присутствуют только NA, следует указать «NA», а не « Ошибка «Я пытался взглянуть на функцию« coalesce »в пакете dplyr, но, похоже, она действительно не выполняет то, что мне нужно. Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 15 января 2020

Один base R параметр может быть:

ifelse(rowSums(!is.na(df)) > 1, "Error", do.call(pmin, c(df, na.rm = TRUE))) 

[1] "Cat"   "Dog"   "Mouse" "Error" "Horse" NA 
2 голосов
/ 15 января 2020

Уменьшая по столбцам df (начиная с первого), сравните текущий столбец (old) со следующим (new). Для каждого элемента:

  • Если old равно NA, выберите new

  • Если old не равно NA затем выберите old, если new также не является NA, тогда 'Error'

:

Reduce(
  function(old, new) ifelse(is.na(old), new, ifelse(!is.na(new), 'Error', old)),
  df)

# [1] "Cat"   "Dog"   "Mouse" "Error" "Horse" NA
2 голосов
/ 15 января 2020

Мы можем использовать coalesce от dplyr. Можно иметь столбец NA only типа logical, и при использовании coalesce может иметь значение sh. Один из вариантов - внести изменения в класс для этого столбца, и тогда coalesce будет работать

library(dplyr)
df1 %>%
   mutate_if(~ all(is.na(.)) && is.logical(.), ~ NA_character_) %>%
   transmute(Summary = case_when(rowSums(!is.na(.)) > 1 ~ "Error",
            TRUE ~ coalesce(!!! .)))
#  Summary
#1     Cat
#2     Dog
#3   Mouse
#4   Error
#5   Horse
#6    <NA>

Данные

df1 <- structure(list(One = c("Cat", NA, NA, "Cat", "Horse", NA), Two = c(NA, 
"Dog", NA, NA, NA, NA), Three = c(NA, NA, NA, "Rat", NA, NA), 
    Four = c(NA, NA, "Mouse", NA, NA, NA), Five = c(NA, NA, NA, 
    NA, NA, NA)), class = "data.frame", row.names = c(NA, -6L
))
...