Fusion de deux colonnes en une seule en R

j'ai la base de données suivante, et j'essaie de fusionner les deux colonnes en une seule, tout en remplaçant NA's avec les valeurs numériques.

ID    A     B
1     3     NA
2     NA    2
3     NA    4
4     1     NA

Le résultat que je veux c'est:

ID    New
1     3
2     2
3     4
4     1

Merci d'avance!

23
demandé sur m0nhawk 2015-04-14 21:06:48

6 réponses

une Autre solution très simple dans ce cas est d'utiliser le rowSums fonction.

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

mise à Jour: Merci @Artem Klevtsov d'avoir mentionné que cette méthode ne fonctionne qu'avec des données numériques.

12
répondu Hao 2015-08-28 16:29:33

Vous pouvez aussi faire: with(d,ifelse(is.na(A),B,A))

d est votre bloc de données.

11
répondu User7598 2015-04-14 18:22:48

Vous pouvez utiliser unitetidyr:

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
9
répondu Colonel Beauvel 2015-04-14 18:14:21

cela n'existait probablement pas lorsque les réponses ont été écrites, mais puisque je suis venu ici avec la même question et que j'ai trouvé une meilleure solution, voici pour les futurs googleurs:

ce que vous voulez est le coalesce() function dplyr:

y <- c(1, 2, NA, NA, 5)
z <- c(NA, NA, 3, 4, 5)
coalesce(y, z)

[1] 1 2 3 4 5
7
répondu jzadra 2017-05-17 17:58:12

Vous pouvez essayer

New <- do.call(pmax, c(df1[-1], na.rm=TRUE))

Ou

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
6
répondu akrun 2015-04-14 18:14:02

en supposant que A ou B ont un NA, cela fonctionnerait très bien:

# 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
5
répondu Krome 2015-04-14 21:39:06