2015-09-30 2 views
3

У меня есть ниже набор данных, который построен изОбъединение столбцов два фактора/символов в одном столбец

help <- data.frame(var1 = c("red", NA, NA, NA, "red", "orange"), 
       var2 = c(NA, "lightred", "blue", "lightred", NA, NA)) 

    var1  var2 
1 red  <NA> 
2 <NA> lightred 
3 <NA>  blue 
4 <NA> lightred 
5 red  <NA> 
6 orange  <NA> 

И я застрял пытаюсь сделать новую переменную newvar, что просто сливает переменный фактор в одну новую колонку , Я надеюсь, чтобы получить выход следующим

var1  var2 newvar 
1 red  <NA> red 
2 <NA> lightred lightred 
3 <NA>  blue blue 
4 <NA> lightred lightred 
5 red  <NA> red 
6 orange  <NA> orange 

Здесь была моя попытка на основе других потоков здесь

help$newvar = ifelse(help$var1 == "", help$var2, help$var1) 

Когда переменные факторы, то newvar являются числами, что имеет смысл, но только переменные из var1 перейти на newvar. Когда символ, снова только символы от var1 перейдите на newvar.

Я знаю, что подобные вопросы были заданы, но ответы, похоже, не исправили эту проблему. Merge two factor columns in R

Есть ли способ сделать это в dplyr тоже? Я возьму любое решение, которое я смогу получить, просто любопытно.

+1

Я не вижу пробелов в вашем 'var1', я вижу отсутствующие значения. Используйте 'is.na (help $ var1)' вместо 'help $ var1 ==" "'. – Gregor

+0

Другая опция 'apply (help, 1, na.omit)' –

ответ

2

Я не вижу пробелов в var1, я вижу недостающие значения. Используйте is.na(help$var1) вместо help$var1 == ""

Вы также захотите преобразовать в персонаж, так как у вас есть факторы с разными уровнями.

help$newvar = ifelse(is.na(help$var1), as.character(help$var2), as.character(help$var1)) 

Конечно, вы можете использовать dplyr, вы просто создание столбец

help = mutate(help, newvar = ifelse(is.na(var1), as.character(var2), as.character(var1))) 

В SQL, эта операция называется сливаться. Вы можете быть заинтересованы в How to implement coalesce efficiently in R

+0

Отлично. Я вижу, что вы имеете в виду с is.na ... Я возился с обоими "" и NA, когда я построил этот df для примера.Когда я оставляю это как фактор, этот код дает мне номера для 'newvar', и когда я конвертирую в символ, он хорошо работает – bpace

+0

Также благодарю вас за ресурс, связанный с объединением – bpace

+0

Спасибо, отредактирован в преобразовании символов. Настоящий урок здесь состоит в том, что пробел отличается от отсутствующего значения. – Gregor

3

Если вы хотите использовать tidyr:

library(tidyr) 

help[] <- lapply(help, as.character) 
help[is.na(help)] <- '' 
unite(help, new, var1:var2, sep='', remove=F) 

#  new var1  var2 
#1  red red   
#2 lightred  lightred 
#3  blue   blue 
#4 lightred  lightred 
#5  red red   
#6 orange orange  

или основание R хак:

transform(help, new = gsub('NA','',do.call(paste0, help)) 

# var1  var2  new 
#1 red  <NA>  red 
#2 <NA> lightred lightred 
#3 <NA>  blue  blue 
#4 <NA> lightred lightred 
#5 red  <NA>  red 
#6 orange  <NA> orange 
2

Вот еще один способ просто Подменю непредоставлением NA клет из от help

t(help)[t(!is.na(help))] 
## [1] "red"  "lightred" "blue"  "lightred" "red"  "orange" 

Потребность в t потому, что Подменю в R будет сделано по столбцам, а не по строкам

1

В этом случае sqldf пакет поставляется в удобной для использования, так как Грегор отметил, функция COALESCE:

library(sqldf) 
help$newvar <- sqldf("select coalesce(var1, var2) newvar from help") 

Выход:

var1  var2 newvar 
1 red  <NA>  red 
2 <NA> lightred lightred 
3 <NA>  blue  blue 
4 <NA> lightred lightred 
5 red  <NA>  red 
6 orange  <NA> orange 
+0

или, возможно, 'help <- sqldf (" select *, coalesce (var1 , var2) newvar from help ")' –

+0

@ G.Grothendieck Спасибо за полезный комментарий – mpalanco