Das Problem des Sammelns mehrerer Sätze von Spalten wurde bereits hier angesprochen: Gather multiple sets of columns, aber in meinem Fall sind die Spalten nicht eindeutig.Sammeln Sie doppelte Spaltensätze in einzelne Spalten
I haben folgende Daten:
input <- data.frame(
id = 1:2,
question = c("a", "b"),
points = 0,
max_points = c(3, 5),
question = c("c", "d"),
points = c(0, 20),
max_points = c(5, 20),
check.names = F,
stringsAsFactors = F
)
input
#> id question points max_points question points max_points
#> 1 1 a 0 3 c 0 5
#> 2 2 b 0 5 d 20 20
Die erste Spalte ist eine ID, dann habe ich viele wiederholten Spalten (der Original-Datensatz hat 133 Spalten):
- Identifikator für die Frage
- Punkte gegeben
- maximale Punktzahl
Ich möchte mit dieser Struktur, um am Ende:
expected <- data.frame(
id = c(1, 2, 1, 2),
question = letters[1:4],
points = c(0, 0, 0, 20),
max_points = c(3, 5, 5, 20),
stringsAsFactors = F
)
expected
#> id question points max_points
#> 1 1 a 0 3
#> 2 2 b 0 5
#> 3 1 c 0 5
#> 4 2 d 20 20
ich mehrere Dinge ausprobiert haben:
tidyr::gather(input, key, val, -id)
reshape2::melt(input, id.vars = "id")
Beide haben die gewünschte Ausgabe nicht liefern. Darüber hinaus funktioniert gather
mit mehr Spalten als hier gezeigt nicht mehr, da zu viele doppelte Spalten vorhanden sind.
Als Abhilfe habe ich versucht, dies:
# add numbers to make col headers "unique"
names(input) <- c("id", paste0(1:(length(names(input)) - 1), names(input)[-1]))
# gather, remove number, spread
input %>%
gather(key, val, -id) %>%
mutate(key = stringr::str_replace_all(key, "[:digit:]", "")) %>%
spread(key, val)
, die einen Fehler gibt: Duplicate identifiers for rows (3, 9), (4, 10), (1, 7), (2, 8)
Dieses Problem bereits hier diskutiert wurde: Unexpected behavior with tidyr, aber ich weiß nicht, warum/wie ich ein anderes hinzufügen soll Kennung. Wahrscheinlich ist das nicht das Hauptproblem, denn ich sollte das Ganze wahrscheinlich anders angehen.
Wie könnte ich mein Problem lösen, vorzugsweise mit tidyr
oder Basis? Ich weiß nicht, wie man data.table
benutzt, aber falls es eine einfache Lösung gibt, werde ich mich auch damit abfinden.
Sind alle Ihre Frage, Max_Points und Punkte Spalten eigentlich das gleiche Ding? –
Vielleicht 'rbind (Eingabe [, c (1, 2: 4)], Eingabe [, c (1, 5: 7)])'? – zx8754
@MikeyMike ja. –