Gegeven twee dataframes a
en b
:
> a
a b c
1 -0.2246894 -1.48167912 -1.65099363
2 0.5559320 -0.87898575 -0.15634590
3 1.8469466 -0.01487524 -0.53098215
4 -0.6875051 0.23880967 0.01824621
5 -0.6735163 0.75485292 0.44154092
> b
a c
1 0.4287284 -0.3295925
2 0.5201492 0.3341251
3 -2.6355570 1.7916780
4 -1.3645337 1.3642276
5 -0.4954542 -0.6660001
Is er een eenvoudige manier om deze samen te voegen om een nieuw gegevensframe van het onderstaande formulier te retourneren?
> new
a b c
1 -0.2246894 -1.48167912106676 -1.65099363
2 0.5559320 -0.878985746842256 -0.15634590
3 1.8469466 -0.0148752354840942 -0.53098215
4 -0.6875051 0.238809666690982 0.01824621
5 -0.6735163 0.754852923524198 0.44154092
6 0.4287284 NA -0.32959248
7 0.5201492 NA 0.33412510
8 -2.6355570 NA 1.79167801
9 -1.3645337 NA 1.36422764
10 -0.4954542 NA -0.66600006
Ik wil de dataframes samenvoegen, de headers matchen en NA
invoegen voor posities in dataframe b
waar de header ontbreekt.
Antwoord 1, autoriteit 100%
U wilt “rbind”.
b$b <- NA
new <- rbind(a, b)
rbind vereist dat de dataframes dezelfde kolommen hebben.
De eerste regel voegt kolom b toe aan dataframe b.
Resultaten
> a <- data.frame(a=c(0,1,2), b=c(3,4,5), c=c(6,7,8))
> a
a b c
1 0 3 6
2 1 4 7
3 2 5 8
> b <- data.frame(a=c(9,10,11), c=c(12,13,14))
> b
a c
1 9 12
2 10 13
3 11 14
> b$b <- NA
> b
a c b
1 9 12 NA
2 10 13 NA
3 11 14 NA
> new <- rbind(a,b)
> new
a b c
1 0 3 6
2 1 4 7
3 2 5 8
4 9 NA 12
5 10 NA 13
6 11 NA 14
Antwoord 2, autoriteit 14%
Probeer het plyr-pakket:
rbind.fill(a,b,c)
Antwoord 3, autoriteit 11%
u kunt de functie gebruiken
bind_rows(a,b)
uit de dplyrbibliotheek
Antwoord 4, autoriteit 5%
Hier is een eenvoudige kleine functie die twee datasets samenbindt nadat automatisch is gedetecteerd welke kolommen in elk ontbreken en deze worden toegevoegd met alle NA
en.
Om welke reden dan ook, retourneert dit VEELsneller op grotere datasets dan met de functie merge
.
fastmerge <- function(d1, d2) {
d1.names <- names(d1)
d2.names <- names(d2)
# columns in d1 but not in d2
d2.add <- setdiff(d1.names, d2.names)
# columns in d2 but not in d1
d1.add <- setdiff(d2.names, d1.names)
# add blank columns to d2
if(length(d2.add) > 0) {
for(i in 1:length(d2.add)) {
d2[d2.add[i]] <- NA
}
}
# add blank columns to d1
if(length(d1.add) > 0) {
for(i in 1:length(d1.add)) {
d1[d1.add[i]] <- NA
}
}
return(rbind(d1, d2))
}
Antwoord 5, autoriteit 2%
Je mag rbind
gebruiken, maar in dit geval moet je hetzelfde aantal kolommen in beide tabellen hebben, dus probeer het volgende:
b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)