2017-05-13 4 views
1

I haben die folgenden Spalten:Ausfüllen der fehlenden Feld für Spalte im Datenrahmen in R

casenum box type number of balls in the box 
    1   A    10 
    1   B    20 
    2   B    1 
    2   C    2 
    2   D    12 
    3   A    10 
    3   B    20 
    3   C    1 
    3   D    2 
    .   .    . 
    .   .    . 
    .   .    . 

Grundsätzlich gibt es 4-Box-Typen (A, B, C, D) und für jede casenum, wenn es keine Bälle in einer Box, es erscheint nicht. Ich möchte jedoch, dass jeder Boxtyp so aussieht.

casenum box type number of balls in the box 
    1   A    10 
    1   B    20 
    1   C    0 
    1   D    0 
    1   A    0 
    2   B    1 
    2   C    2 
    2   D    12 
    3   A    10 
    3   B    20 
    3   C    1 
    3   D    2 
    .   .    . 
    .   .    . 
    .   .    . 

Gibt es eine einfache Möglichkeit, das zu tun?

Oder kann ich in in einem Format haben

casenum ballnum in A  ballnum in B  ballnum in C  ballnum in D 
    1   10    20    0     0 
    2   0     1    2     12 
    3   10    20    1     2 
    .   .     .    .     . 
    .   .     .    .     . 

I verwendet, während Schleife um dies zu erreichen, aber ich frage mich, ob es einen Weg gibt, es zu tun (einige Bibliotheken, die ich nicht bewusst bin) ohne Schleifen zu verwenden.

Antwort

1

Es ist die Aufgabe für xtabs in Basis R wo df Datenrahmen ist :

xtabs(number~., df) 

#  box 
#casenum A B C D 
#  1 10 20 0 0 
#  2 0 1 2 12 
#  3 10 20 1 2 
1

würde ich ein neues data.frame mit allen möglichen Kombinationen von Box und casenum erstellen und dann die Anzahl der Kugeln hinzu:

df<-read.table(text="casenum box number 
1   A    10 
1   B    20 
2   B    1 
2   C    2 
2   D    12 
3   A    10 
3   B    20 
3   C    1 
3   D    2", header=T) 

dftot <- data.frame(casenum=rep(1:3, each=4), box=c("A","B","C","D"), stringsAsFactors = F) #create new df with all combinations of casenum and box 
dftot$number <- df$number[match(paste(dftot$casenum,dftot$box),paste(df$casenum, df$box))] #add numbers from your original data.frame 
dftot$number[is.na(dftot$number)] <- 0 #change all NA values to 0 
1

Wir acast von reshape2

library(reshape2) 
acast(df, casenum~box, fill=0) 
# A B C D 
#1 10 20 0 0 
#2 0 1 2 12 
#3 10 20 1 2 
verwenden
+1

danke für die alternative antwort. – user98235

Verwandte Themen