Ответ 1
Вы также можете сделать: with(d,ifelse(is.na(A),B,A))
где d
- ваш кадр данных.
У меня есть следующий фрейм данных, и я пытаюсь объединить два столбца в один, заменяя NA
числовыми значениями.
ID A B
1 3 NA
2 NA 2
3 NA 4
4 1 NA
В результате я хочу:
ID New
1 3
2 2
3 4
4 1
Спасибо заранее!
Вы также можете сделать: with(d,ifelse(is.na(A),B,A))
где d
- ваш кадр данных.
Другим очень простым решением в этом случае является использование функции rowSums
.
df$New<-rowSums(df[, c("A", "B")], na.rm=T)
df<-df[, c("ID", "New")]
Обновление: Спасибо @Artem Klevtsov за упоминание, что этот метод работает только с числовыми данными.
Вы можете использовать unite
от tidyr
:
library(tidyr)
df[is.na(df)] = ''
unite(df, new, A:B, sep='')
# ID new
#1 1 3
#2 2 2
#3 3 4
#4 4 1
Вы можете попробовать
New <- do.call(pmax, c(df1[-1], na.rm=TRUE))
или
New <- df1[-1][cbind(1:nrow(df1),max.col(!is.na(df1[-1])))]
d1 <- data.frame(ID=df1$ID, New)
d1
# ID New
#1 1 3
#2 2 2
#3 3 4
#4 4 1
Это, вероятно, не существовало, когда ответы были написаны, но поскольку я пришел сюда с тем же вопросом и нашел лучшее решение, вот он для будущих googlers:
Что вы хотите, это функция coalesce()
от dplyr
:
y <- c(1, 2, NA, NA, 5)
z <- c(NA, NA, 3, 4, 5)
coalesce(y, z)
[1] 1 2 3 4 5
Предполагая, что A или B имеют NA, это будет нормально работать:
# creating initial data frame (actually data.table in this case)
library(data.table)
x<- as.data.table(list(ID = c(1,2,3,4), A = c(3, NA, NA, 1), B = c(NA, 2, 4, NA)))
x
# ID A B
#1: 1 3 NA
#2: 2 NA 2
#3: 3 NA 4
#4: 4 1 NA
#solution
y[,New := na.omit(c(A,B)), by = ID][,c("A","B"):=NULL]
y
# ID New
#1: 1 3
#2: 2 2
#3: 3 4
#4: 4 1