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!
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.
Vous pouvez aussi faire: with(d,ifelse(is.na(A),B,A))
oùd
est votre bloc de données.
Vous pouvez utiliser 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
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
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
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