2016-04-17 6 views
1
v 

    id a b  c d 
1 1 1 Adam Smith 10 
2 2 2 John Bond 15 
3 3 3 Sam Ted 20 

Ich gab den folgenden Befehl an der Eingabeaufforderung aus.Versuchen Sie, Zeilen in einem Datenrahmen zu replizieren?

> v1<-rbind(v,rep(c(4,5,"Deb","Jones",25),5)) 

Ich versuche, einen Datenrahmen v1 aus dem Datenrahmen v zu machen, wo v1 sollte wie folgt aussehen:

> v1 

    id a b  c d 
1 1 1 Adam Smith 10 
2 2 2 John Bond 15 
3 3 3 Sam Ted 20 
4 4 5 Deb Jones 25 
5 4 5 Deb Jones 25 
6 4 5 Deb Jones 25 
7 4 5 Deb Jones 25 
8 4 5 Deb Jones 25 

Aber was ich eigentlich bin immer ist dies:

> v1 

    id a b  c d 
1 1 1 Adam Smith 10 
2 2 2 John Bond 15 
3 3 3 Sam Ted 20 
4 4 5 Deb Jones 25 

Warum erscheint die Zeile "4 5 Deb Jones 25" nur einmal in v1 statt 5 mal?

Neuling hier. Also bitte erklären Sie es in einfachem Englisch. Alle Hilfe wird geschätzt.

Dank

+0

'rep' erstellt einen Vektor mit 5 Exemplare von "4 5 Deb Jones 25" in einer einzigen Zeile – jaimedash

+0

Vielen Dank – MrsDP

Antwort

3

rep funktioniert nicht auf diese Art und Weise - es wird die Ausgänge in einen Vektor nur verketten, die rbind wie eine einzige Zeile aussieht. Dann rbind schneidet seine Eingaben, um die kürzeste Zeile zu entsprechen.

Stattdessen können Sie lapply auf einen Vektor mit entsprechender Länge (5) hier verwenden und die Zeile jedes Mal zurückgeben. list_of_rows <- lapply(1:5, function(pass) list(4,5,"Deb","Jones",25)) Dies gibt Ihnen eine Liste der Zeilen. Sie können do.call(rbind, list_of_rows) verwenden, um das in eine Matrix mit 5 identischen Zeilen umzuwandeln.

können Sie wickeln, dass die Matrix in einem data.frame:

df_tmp <- data.frame(do.call(rbind, lapply(1:5, function(pass) list(4,5,"Deb","Jones",25))))

X1 X2 X3 X4 X5 
1 4 5 Deb Jones 25 
2 4 5 Deb Jones 25 
3 4 5 Deb Jones 25 
4 4 5 Deb Jones 25 
5 4 5 Deb Jones 25 

Während df_tmp ok aussieht, jede Spalte tatsächlich eine Liste, die mit ärgerlich ist, zu arbeiten. Sie können dieses Problem beheben mit unlist

df <-lapply(df_tmp, unlist) 
str(df) 

List of 5 
$ X1: num [1:5] 4 4 4 4 4 
$ X2: num [1:5] 5 5 5 5 5 
$ X3: chr [1:5] "Deb" "Deb" "Deb" "Deb" ... 
$ X4: chr [1:5] "Jones" "Jones" "Jones" "Jones" ... 
$ X5: num [1:5] 25 25 25 25 25 

Dank @thelatemail für das Problem mit früheren Lösung c statt list

+0

Vielen Dank. – MrsDP

+1

Beachten Sie, dass dies alles zum Charakter (und dann ein Faktor) - z. - Überprüfen Sie die Ergebnisse von 'c (4,5," Deb "," Jones ", 25)' - so etwas wie 'setNames (data.frame (liste (4,5," Deb "," Jones ", 25)), Namen (v)) [rep (1,5),] 'könnte eine Übersetzung sein, um sicherzustellen, dass numerische Daten numerisch bleiben. – thelatemail

+0

Sie können dies vermeiden, indem Sie "c" durch "list" in der Antwort ersetzen, aber dann hat data.frame Spalten in der Liste ... Oh, aber mit 'unlist" kann das behoben werden. Danke. Ich habe die Antwort bearbeitet – jaimedash

2

mit Hinweis auf Sie könnten auch ein list Objekt übergeben nur die Zeilen, die Sie in v wollen füllen.

v[4:8,] <- list(4,5,"Deb","Jones",25) 
# or without knowing the number of rows: 
v[(nrow(v)+1):(nrow(v)+5),] <- list(4,5,"Deb","Jones",25) 

# id a b  c d 
#1 1 1 Adam Smith 10 
#2 2 2 John Bond 15 
#3 3 3 Sam Ted 20 
#4 4 5 Deb Jones 25 
#5 4 5 Deb Jones 25 
#6 4 5 Deb Jones 25 
#7 4 5 Deb Jones 25 
#8 4 5 Deb Jones 25 

Wo v war:

v <- data.frame(id=1:3, a=1:3, b=c("Adam","John","Sam"), 
    c=c("Smith","Bond","Ted"), d=c(10,15,20), stringsAsFactors=FALSE) 
+0

Vielen Dank – MrsDP

Verwandte Themen