Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
philoo7
Beiträge: 9
Registriert: Mo Nov 09, 2020 9:55 am

Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen

Beitrag von philoo7 »

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 (
Datensätze.zip
(59.47 KiB) 83-mal heruntergeladen
) komprimiert.

Vielen Dank für eure Bemühungen.

Lg Phil
bigben
Beiträge: 2780
Registriert: Mi Okt 12, 2016 9:09 am

Re: Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen

Beitrag von bigben »

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:

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)
Die dann mit rbind miteinander verbindet und dann die Reihenfolge anpasst:

Code: Alles auswählen

gesamt <- rbind(DS1, DS2, DS3)
gesamt[c(1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14),]
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:

Code: Alles auswählen

zeilenalgo <- function(datensaetze, zeilen)
    as.vector(matrix(1:(datensaetze*zeilen), nrow = datensaetze, byrow = TRUE))
Für mein Beispiel mit drei Datensätzen und je 5 Zeilen würde das dann so aussehen:

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
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen

Beitrag von jogo »

Hallo Phil,

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),]
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
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen

Beitrag von Athomas »

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)
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Spalte mit Inhalt aus mehreren Datensätzen zeilenweise erstellen

Beitrag von Athomas »

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) 
Antworten