Hallo,
ich würde gerne einen Datensatz erstellen, der sich aus 3 Datensätzen zusammensetzt. Ich denke, dass ich mit Schleifen und Indizierung arbeiten muss, leider habe ich dazu jedoch noch kein Video oder Erklärung gefunden. Wahrscheinlich ist es kein Hexenwerk. Vielleicht hat ja jemand eine Idee.
Der Datensatz sollte folgende Struktur haben:
Zeile 1: 1. Zeile von Datensatz 1
Zeile 2: 1. Zeile von Datensatz 2
Zeile 3: 1. Zeile von Datensatz 3
Zeile 4: 1. Zeile von Datensatz 4
Zeile 5: 1. Zeile von Datensatz 5
und weiter ab Zeile 6
Zeile 6: 2. Zeile von Datensatz 1
Zeile 7: 2. Zeile von Datensatz 2
Zeile 8: 2. Zeile von Datensatz 3
Zeile 9: 2. Zeile von Datensatz 4
Zeile 10: 2. Zeile von Datensatz 5
Anbei habe ich mit Excel einen Datensatz erstellt, wie das am Ende aussehen soll. Als Beispiel habe ich Datensätz 1 bis 5 beigefügt. Als zip ( ) komprimiert.
Vielen Dank für eure Bemühungen.
Lg Phil
Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen
Re: Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen
Hallo Phil,
ich habe jetzt die Datensätze noch nicht heruntergeladen und entpackt. Dürfen wir davon ausgehen, dass Datensätze die gleiche Anzahl Zeilen haben?
Ich hätte jetzt gedacht, dass man sich drei Datensätze nimmt:
Die dann mit rbind miteinander verbindet und dann die Reihenfolge anpasst:
Bevor man sich jetzt einen schönen Algorithmus für die richtige Zeilenreihenfolge ausdenkt wäre es aber wichtig zu wissen, ob die Zeilenzahl unterschiedlich sein kann und wie dann vorgegangen werden soll. Sollen Zeilen mit NA eingefügt werden oder soll es einfach so weitergehen?
Wenn wir davon ausgehen dürfen, dass alle Datensätze gleich viele Zeilen haben, könnte man die Zeilenreihenfolge mit der folgenden Funktion festlegen:
Für mein Beispiel mit drei Datensätzen und je 5 Zeilen würde das dann so aussehen:
LG,
Bernhard
ich habe jetzt die Datensätze noch nicht heruntergeladen und entpackt. Dürfen wir davon ausgehen, dass Datensätze die gleiche Anzahl Zeilen haben?
Ich hätte jetzt gedacht, dass man sich drei Datensätze nimmt:
Code: Alles auswählen
DS1 <- data.frame(text = c("Zeile 1 aus DS1", "Zeile 2 aus DS1", "Zeile 3 aus DS1",
"Zeile 4 aus DS1","Zeile 5 aus DS1"),
zahl = 1:5)
DS2 <- data.frame(text = c("Zeile 1 aus DS2", "Zeile 2 aus DS2", "Zeile 3 aus DS2",
"Zeile 4 aus DS2","Zeile 5 aus DS2"),
zahl = 6:10)
DS3 <- data.frame(text = c("Zeile 1 aus DS3", "Zeile 2 aus DS3", "Zeile 3 aus DS3",
"Zeile 4 aus DS3","Zeile 5 aus DS3"),
zahl = 11:15)
Code: Alles auswählen
gesamt <- rbind(DS1, DS2, DS3)
gesamt[c(1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14),]
Wenn wir davon ausgehen dürfen, dass alle Datensätze gleich viele Zeilen haben, könnte man die Zeilenreihenfolge mit der folgenden Funktion festlegen:
Code: Alles auswählen
zeilenalgo <- function(datensaetze, zeilen)
as.vector(matrix(1:(datensaetze*zeilen), nrow = datensaetze, byrow = TRUE))
Code: Alles auswählen
> zeilenalgo(datensaetze = 3, zeilen = 5)
[1] 1 6 11 2 7 12 3 8 13 4 9 14 5 10 15
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen
Hallo Phil,
hier ein Vorschlag von mir. Ich nehme bei dem Beispiel die Daten von Bernhard (Dank an Bernhard für die Daten).
Mein Vorschlag funktioniert auch, wenn die Dataframes verschiedenen Anzahlen von Zeilen haben.
mal eine Frage aus Neugier:
Wie ist denn diese Ansammlung von Dataframes entstanden?
Vielleicht wäre statt dessen eine Liste von Dataframes die geeignete Stuktur gewesen.
Gruß, Jörg
hier ein Vorschlag von mir. Ich nehme bei dem Beispiel die Daten von Bernhard (Dank an Bernhard für die Daten).
Code: Alles auswählen
DS1 <- data.frame(text = c("Zeile 1 aus DS1", "Zeile 2 aus DS1", "Zeile 3 aus DS1",
"Zeile 4 aus DS1","Zeile 5 aus DS1"),
zahl = 1:5)
DS2 <- data.frame(text = c("Zeile 1 aus DS2", "Zeile 2 aus DS2", "Zeile 3 aus DS2",
"Zeile 4 aus DS2","Zeile 5 aus DS2"),
zahl = 6:10)
DS3 <- data.frame(text = c("Zeile 1 aus DS3", "Zeile 2 aus DS3", "Zeile 3 aus DS3",
"Zeile 4 aus DS3","Zeile 5 aus DS3"),
zahl = 11:15)
L <- list(DS1, DS2, DS3)
for (i in 1:length(L)) L[[i]]$DSatz <- i
L2 <- lapply(L, function(D) { D$zeile <- 1:nrow(D); D})
DSall <- do.call(rbind, L2)
DSall[order(DSall$zeile, DSall$DSatz),]
mal eine Frage aus Neugier:
Wie ist denn diese Ansammlung von Dataframes entstanden?
Vielleicht wäre statt dessen eine Liste von Dataframes die geeignete Stuktur gewesen.
Gruß, Jörg
Re: Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen
Hallo zusammen, dann mache ich auch (gerne) beim Veteranen-Treffen mit und biete unter Verwendung der Vorleistungen meiner geschätzten Mitstreiter eine data.table-Lösung an:
Code: Alles auswählen
library(data.table)
DS <- list()
DS[[1]] <- data.table(text = c("Zeile 1 aus DS1", "Zeile 2 aus DS1", "Zeile 3 aus DS1",
"Zeile 4 aus DS1","Zeile 5 aus DS1"),
zahl = 1:5)
DS[[2]] <- data.table(text = c("Zeile 1 aus DS2", "Zeile 2 aus DS2", "Zeile 3 aus DS2",
"Zeile 4 aus DS2","Zeile 5 aus DS2"),
zahl = 6:10)
DS[[3]] <- data.table(text = c("Zeile 1 aus DS3", "Zeile 2 aus DS3", "Zeile 3 aus DS3",
"Zeile 4 aus DS3","Zeile 5 aus DS3"),
zahl = 11:15)
for (i in 1:3) DS[[i]][ , ":="(Dateinummer=i, Satznummer=.I)]
L <- rbindlist(DS)
setorder(L, Satznummer, Dateinummer)
Re: Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen
Wobei ich mir jetzt noch mal Deine Spieldaten angeschaut habe: Du hast da ja schon eine Art Vertragsnummer (GKZ) - die Du ja in Deiner Beschreibung als "Zeilennummer" verstanden hast - und eine Art Dateinummer (Jahr). Damit kannst Du Dir das meiste Drumherum in den angebotenen Lösungen sparen...
Code: Alles auswählen
library(data.table)
library(xlsx)
Basis <- "P:/R/R Forum/nochn datatable" # oder wo auch immer die Daten liegen
DS <- list()
Dateien <- list.files(Basis, pattern="Datensatz*", full.names = TRUE) # "pattern" muss entsprechend angepasst werden - am Besten nix anderes im dir
for (i in seq_along(Dateien)) DS[[i]] <- data.table(read.xlsx(Dateien[i], sheetIndex = 1))[!is.na(GKZ)]
L <- rbindlist(DS)
setorder(L, GKZ, Jahr)