2012-04-03 7 views
2

I drei Datenrahmen aufweisen, wobei die erste (mit Spaltenüberschriften, aber keine Reihennummerierung) sieht aus wieFilling in einem Datensatz unter Verwendung von drei „Puzzleteile“

ID 1 2 3 
A 12 NA NA 
B NA 7 NA 
C NA NA 22 

Die zweite wie

aussehen
ID 1 2 3 
A NA 6 NA 
B NA NA 29 
C 43 NA NA 

Schließlich die dritte sieht aus wie

ID 1 2 3 
A NA NA 32 
B 5 NA NA 
C NA 2 NA 

die erste Spalte ist eine Spalte ID und das gleiche für alle drei Datenrahmen. Die letzten drei Spalten repräsentieren die gleichen Variablen (1, 2 und 3). Der Datensatz für die Beobachtung A, Variable 1, befindet sich nur in einem der Datensätze. Das ist der Datensatz für die Beobachtung A, Variable 2, aber er befindet sich in einem anderen Datensatz.

Wie kann ich diese Daten zusammenführen setzt zusammen so etwas wie

ID 1 2 3 
A 12 6 32 
B 5 7 29 
C 43 2 22 

Ich entschuldige mich zu bekommen, dass ich keine bessere Art und Weise hatte, dieses Problem zu beschreiben. Wenn jemand die Terminologie dafür teilen könnte, wäre das großartig.

Antwort

1

Nizza Titel! Das ist ganz ähnlich wie R - Vector/ Array Addition

Sie Ihre Daten in ein mehrdimensionales Array drehen können dann Summe oder den Mittelwert über die „Puzzleteil“ Dimension nehmen:

df1 <- read.table(text="ID 1 2 3 
A 12 NA NA 
B NA 7 NA 
C NA NA 22", header = TRUE) 

df2 <- read.table(text="ID 1 2 3 
A NA 6 NA 
B NA NA 29 
C 43 NA NA", header = TRUE) 

df3 <- read.table(text="ID 1 2 3 
A NA NA 32 
B 5 NA NA 
C NA 2 NA", header = TRUE) 

# gather inputs and remove common ID column 
lists <- list(df1, df2, df3) 
pieces <- lapply(lists, '[', , -1) 

# turn data into a multi-dimensional array 
a <- array(unlist(pieces), dim = c(nrow(df1), 
            ncol(df1) - 1, 
            length(pieces))) 

# compute sums across pieces 
rowSums(a, na.rm = TRUE, dims = 2) 
# [,1] [,2] [,3] 
# [1,] 12 6 32 
# [2,] 5 7 29 
# [3,] 43 2 22 

Dann bist du nur mit dem Einfügen links die ID-Spalte zurück.

2

I didn't come up with it aber:

merge.new<-function(...,col.ID){ 
    inter<-merge(...) 
    inter<-inter[order(inter[col.ID]),] #merged data sorted by ID 

    #total columns and rows for the target dataframe 
    total.row<-length(unique(inter[[col.ID]])) 
    total.col<-dim(inter)[2] 
    row.ID<-unique(inter[[col.ID]]) 
    target<-matrix(NA,total.row,total.col) 
    target<-as.data.frame(target) 
    names(target)<-names(inter) 

    for (i in 1:total.row){ 
     inter.part<-inter[inter[col.ID]==row.ID[i],] #select all rows with the same ID 
     for (j in 1:total.col){ 
      if (is.na(inter.part[1,j])){ 
       if(is.na(inter.part[2,j])) {target[i,j]=NA} 
       else {target[i,j]=inter.part[2,j]} 
      } 
      else {target[i,j]=inter.part[1,j]} 

     } 
    } 
print(paste("total rows=",total.row)) 
print(paste("total columns=",total.col)) 
return(target) 
} 

, wenn Ihre Daten ein benannt ist, zwei und drei:

> one 
    ID 1 2 3 
2 A 12 NA NA 
3 B NA 7 NA 
4 C NA NA 22 
> two 
    ID 1 2 3 
2 A NA 6 NA 
3 B NA NA 29 
4 C 43 NA NA 
> three 
    ID 1 2 3 
2 A NA NA 32 
3 B 5 NA NA 
4 C NA 2 NA 
> merge.new(merge.new(one, two, all=TRUE, col.ID=1), three, all=TRUE, col.ID=1) 
[1] "total rows= 3" 
[1] "total columns= 4" 
[1] "total rows= 3" 
[1] "total columns= 4" 
    ID 1 2 3 
1 A 12 6 32 
2 B 5 7 29 
3 C 43 2 22 
> 
2

Ich bin mir nicht sicher, ob Sie diese direkt mit Datenrahmen zu tun, aber es ist sehr einfach, sie zu konvertieren erste Matrizen, wenn nicht:

x <- matrix(c(12,NA,NA,NA,7,NA,NA,NA,22),3,3) 
y <- matrix(c(NA,NA,43,6,NA,NA,NA,29,NA),3,3) 
z <- matrix(c(NA,5,NA,NA,NA,2,32,NA,NA),3,3) 
b <- matrix(0,3,3) 
b[!is.na(x)] <- x[!is.na(x)] 
b[!is.na(y)] <- y[!is.na(y)] 
b[!is.na(z)] <- z[!is.na(z)] 
b 
    [,1] [,2] [,3] 
[1,] 12 6 32 
[2,] 5 7 29 
[3,] 43 2 22 
Verwandte Themen