Объединить два строковых столбца с чередованием пропущенных значений в одном
2412 просмотра
6 ответа
У меня есть фрейм данных с двумя столбцами «а» и «б» с чередующимися пропущенными значениями ( NA
)
a b
dog <NA>
mouse <NA>
<NA> cat
bird <NA>
Я хочу "объединить" / объединить их в новый столбец c, который выглядит следующим образом, т.е. NA
выбран неэлемент в каждой строке:
c
dog
mouse
cat
bird
Я пытался merge
и join
, но ни один не работал, как я хотел. Может потому, что у меня нет идентификатора, с которым нужно сливаться? Для целых чисел я бы просто обошел это и добавил бы оба столбца, но как в моем случае?
Ответы (6)
8 плюса
Вы можете попробовать 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:254 плюса
Я написал функцию 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 плюса
Вот моя попытка (изменено @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
3 плюса
Другой вариант заключается в использовании 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 плюса
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
1 плюс
Вы можете использовать простое 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
Вопросы из категории :
- r Как получить доступ к последнему значению в векторе?
- r Пакеты оптимизации для R
- r Есть ли у R такие операторские операции, как Perl qw ()?
- r Библиотека / инструмент для рисования тройных / треугольных графиков
- r Участки без заголовков / надписей в R
- r Расчет скользящей средней
- r Режим Emacs ESS - вкладка для области комментариев
- r Преобразование данных из многих строк во многие столбцы
- r Проверить, содержит ли вектор данный элемент
- r Поиск всех позиций для нескольких элементов в векторе
- r Разница между скобками [] и двойной скобкой [[]] для доступа к элементам списка или кадра данных
- r Написание функций на R с учетом объема работ
- r Линейная регрессия и группировка по R
- r Как заставить выполнение приостановить, поспать, подождать X секунд в R?
- r Уровни коэффициента отбрасывания в заданном кадре данных
- r Графики рядом с ggplot2
- r Как отсортировать фрейм данных по нескольким столбцам
- r Как объединить (объединить) кадры данных (внутренний, внешний, левый, правый)?
- r Поворотные и интервальные метки на оси ggplot2
- r Как избежать цикла в R: выбор элементов из списка