2017-03-22 46 views
1

Ich versuche eine Übersichtstabelle zu erstellen, die mir eine Fahrradnutzung in einem Borough angibt. Die Formel dafür istR Dataframe: Fehlerargument impliziert unterschiedliche Anzahl von Zeilen

(Anzahl der mal ein Fahrrad gemietet ist, insbesondere Borough)/(Gesamtanzahl der Mieten in diesem Bezirk).

Endgültige Ausgabe sollte in etwa so aussehen.

BikeId Borough  Pct 
    1  K&C   0.02 
    1  Hammersmith 0.45 
    7  K&C   0.32 

Um das zu erreichen, dass ich wie unten eine Funktion zu implementieren versuchen:

smplData <- function(df) { 
#initialize an empty dataframe 
summDf <- data.frame(BikeId = character(), Borough = character(), Pct = 
       double()) 

#create a vector of unique borough names 
boro <- unique(df[,"Start.Borough"]) 
for (i in 1:length(boro)){ 
    #looping through each borough and create a freq table 
    bkCntBor<- table(df[df$Start.Borough==boro[i],"Bike.Id"]) 
    #total number of rentals in a particular borough 
    borCnt <- nrow(df[df$Start.Borough==boro[i],]) 
    for (j in 1:length(bkCntBor)){ 
     #looping thru each bike for the ith borough and calculate ratio of jth bike 
     bkPct <- as.vector(bkCntBor[j])/borCnt 
     #temp dataframe to store a single row corresponding to bike, boro and ratio 
     dfTmp <- data.frame(BikeId = names(bkCntBor[j]), Borough = boro[i], 
     Pct = bkPct) 
     #append to summary table 
     summDf <<- rbind(summDf, dfTmp) 
    } 

} 
} 

Der Leiter des df-Datensatz ist als unten

>head(df) 
Bike.Id Start.Borough Rental.Id 
     1   K&C 61349872 
     1   K&C 61361611 
     1 Royal Parks 61362295 
     1   K&C 61364627 
     1   K&C 61367817 
     1   H&F 61368333 

Wenn ich die Funktion laufe nach dem Einfügen ein Datensatz in SummDf Ich bekomme den folgenden Fehler

Fehler bei data.frame (BikeId = Namen (bkCntBor [j]), Borough = boro [i], Pct = bkPct): Argumente unterschiedliche Anzahl der Zeilen implizieren: 0, 1

Ich kann den Lauf der Funktionscode in der Konsole, indem jeweils ein Wert für i und j übergeben wird. Aber wenn ich es als eine Funktion starte, erhalte ich den oben erwähnten Fehler. Jede Hilfe, die Sie bereitstellen können, wird erstaunlich sein.
Hier sind einige Beispieldaten für das gleiche.

Bike.Id Start.Borough 
1   K&C  
1   K&C  
1   K&C  
7   K&C 
7   K&C 
1   Hammersmith 
1   Hammersmith 
7   Hammersmith 
9   Hammersmith 
9   Westminster    
+0

Sie sollten Beispieldaten in einem [reproduzierbaren Format] teilen (http://stackoverflow.com/questions/5963269/how-to-make-a-great -r-reproduzierbar-Beispiel). Sie scheinen auch eine Klammer in Ihrem Funktionscode zu fehlen, so dass es nicht syntaktisch gültig ist. Und schließlich ist das Hinzufügen einer Zeile auf einmal zu einem data.frame eine schrecklich ineffiziente Prozedur. Es wäre besser, mit einer klaren Beschreibung dessen zu beginnen, was Sie zu tun versuchen, anstatt zu verlangen, dass wir die Absichten dieses nicht funktionierenden Codes interpretieren. – MrFlick

+0

@MrFlick entschuldigen Sie sich dafür. Ich habe die Frage mit relevanter Absicht aktualisiert, Beispieldaten eingegeben und den Code mit der fehlenden Klammer korrigiert. – rkadam

Antwort

0

Hier ist eine Option dplyr

library(dplyr) 
dd %>% 
    group_by(Start.Borough, Bike.Id) %>% 
    summarize(n=n()) %>% 
    mutate(pct = n/sum(n)) %>% 
    select(-n) 

Zuerst haben wir group_by() finden die Zählungen der Stadtgemeinde/Fahrrad Kombinationen verwenden. Dann mutieren wir diese Aufzeichnungen, um die Anzahl der Bezirke/Fahrräder mit der Summe aller Fahrräder im Bezirk zu teilen.

Start.Borough Bike.Id prop 
     <fctr> <int> <dbl> 
1 Hammersmith  1 0.50 
2 Hammersmith  7 0.25 
3 Hammersmith  9 0.25 
4   K&C  1 0.60 
5   K&C  7 0.40 
6 Westminster  9 1.00 

mit dem Probeneingang

dd <- data.frame(Bike.Id = c(1, 1, 1, 7, 7, 1, 1, 7, 9, 9), 
    Start.Borough = c("K&C", "K&C", "K&C", "K&C", "K&C", "Hammersmith", 
    "Hammersmith", "Hammersmith", "Hammersmith", "Westminster")) 
Verwandte Themen