Объединить два строковых столбца с чередованием пропущенных значений в одном

r

2412 просмотра

6 ответа

700 Репутация автора

У меня есть фрейм данных с двумя столбцами «а» и «б» с чередующимися пропущенными значениями ( NA)

a      b
dog    <NA>
mouse  <NA>
<NA>   cat
bird   <NA>

Я хочу "объединить" / объединить их в новый столбец c, который выглядит следующим образом, т.е. NAвыбран неэлемент в каждой строке:

c
dog
mouse
cat
bird

Я пытался mergeи join, но ни один не работал, как я хотел. Может потому, что у меня нет идентификатора, с которым нужно сливаться? Для целых чисел я бы просто обошел это и добавил бы оба столбца, но как в моем случае?

Автор: ben_aaron Источник Размещён: 08.01.2015 10:02

Ответы (6)


4 плюса

135885 Репутация автора

Я написал функцию coalesce () для этого типа задач, которая работает так же, как функция SQL coalesce. Вы бы использовали это как

dd<-read.table(text="a      b
dog    NA
mouse  NA
NA   cat
bird   NA", header=T)

dd$c <- with(dd, coalesce(a,b))
dd
#       a    b     c
# 1   dog <NA>   dog
# 2 mouse <NA> mouse
# 3  <NA>  cat   cat
# 4  bird <NA>  bird
Автор: MrFlick Размещён: 08.01.2015 10:15

4 плюса

81260 Репутация автора

Вот моя попытка (изменено @MrFlick)

df$c <- apply(df, 1, function(x) na.omit(x)[1])
df
#       a    b     c
# 1   dog <NA>   dog
# 2 mouse <NA> mouse
# 3  <NA>  cat   cat
# 4  bird <NA>  bird
Автор: David Arenburg Размещён: 08.01.2015 10:17

1 плюс

30930 Репутация автора

Вы можете использовать простое apply:

df$c <- apply(df,1,function(x)  x[!is.na(x)]  ) 

> df
      a    b     c
1   dog <NA>   dog
2 mouse <NA> mouse
3  <NA>  cat   cat
4  bird <NA>  bird
Автор: LyzandeR Размещён: 08.01.2015 10:17

8 плюса

46339 Репутация автора

Решение

Вы можете попробовать pmax

df$c <- pmax(df$a, df$b)
df
#       a    b     c
# 1   dog <NA>   dog
# 2 mouse <NA> mouse
# 3  <NA>  cat   cat
# 4  bird <NA>  bird

... или ifelse:

df$c <- ifelse(is.na(df$a), df$b, df$a)

Для более общих решений в случаях с более чем двумя столбцами вы найдете несколько способов реализации объединения в R здесь .

Автор: Henrik Размещён: 08.01.2015 10:25

3 плюса

482788 Репутация автора

Другой вариант заключается в использовании whichсarr.ind=TRUE

indx <- which(!is.na(df), arr.ind=TRUE)
df$c <-  df[indx][order(indx[,1])]
df
#    a    b     c
#1   dog <NA>   dog
#2 mouse <NA> mouse
#3  <NA>  cat   cat
#4  bird <NA>  bird

Или же

df$c <- df[cbind(1:nrow(df),max.col(!is.na(df)))]
Автор: akrun Размещён: 09.01.2015 11:56

2 плюса

51 Репутация автора

dpyr имеет именно то, что вы ищете, функция coalesce()

library(dplyr)

a<-c("dog","mouse",NA,"bird")
b<-c(NA,NA,"cat",NA)

coalesce(a,b)

[1] "dog"   "mouse" "cat"   "bird"
Автор: Konstantin Mingoulin Размещён: 28.08.2018 03:35
Вопросы из категории :
32x32