Подтвердить что ты не робот

Объединение двух столбцов в один из R

У меня есть следующий фрейм данных, и я пытаюсь объединить два столбца в один, заменяя 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

Спасибо заранее!

4b9b3361

Ответ 1

Вы также можете сделать: with(d,ifelse(is.na(A),B,A))

где d - ваш кадр данных.

Ответ 2

Другим очень простым решением в этом случае является использование функции rowSums.

df$New<-rowSums(df[, c("A", "B")], na.rm=T)
df<-df[, c("ID", "New")]

Обновление: Спасибо @Artem Klevtsov за упоминание, что этот метод работает только с числовыми данными.

Ответ 3

Вы можете использовать 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

Ответ 4

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

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

Ответ 5

Это, вероятно, не существовало, когда ответы были написаны, но поскольку я пришел сюда с тем же вопросом и нашел лучшее решение, вот он для будущих 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

Ответ 6

Предполагая, что 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