Hier ist ein Versuch mit tidyverse
package.After alles zum Umwandeln des Charakters (dh grade[] <- lapply(grade, as.character)
) schaffen wir eine benutzerdefinierte Funktion, die die subject:grade
sortiert zurückgibt für jede StudentID
. Wir verwenden dann unnest
, um es lang zu machen, und verwenden separate
, um es in zwei Spalten aufzuteilen; Subject
und Grade
. Schließlich wir spread
, um eine Spalte für jedes Thema zu erhalten.
library(tidyverse)
#This function could definetely be more elegant or even avoided
# but this is as far as my regex knowledge allows me to go
mysplit <- function(x){
y <- strsplit(x, ':\\s+|\\s+')[[1]]
z <- paste0(y[c(T, F)], ': ', y[c(F, T)])
return(z[order(sub(':.*', '', z))])
}
grade %>%
mutate(Grade = lapply(Grade, mysplit)) %>%
unnest() %>%
separate(Grade, into = c('Subject', 'Grade'), sep = ': ') %>%
spread(Subject, Grade)
, die sie als so aufgeteilt werden:
... Biology Chemitry English Geography History Literature Math Physics
... 1 6.00 6.00 <NA> <NA> <NA> 7.50 4.25 6.80
... 2 5.80 6.00 <NA> <NA> <NA> 6.00 5.75 <NA>
... 3 <NA> <NA> <NA> 8.00 4.50 7.75 2.25 <NA>
... 4 <NA> <NA> <NA> 7.25 7.50 7.75 3.25 <NA>
... 5 <NA> <NA> <NA> 7.75 4.50 8.25 1.75 <NA>
... 6 <NA> 6.60 6.78 <NA> <NA> 7.00 8.75 8.40
.
.
Zum besseren Verständnis der Funktion sollten Sie es brechen. Sagen tha x
ist folgende:
x
#[1] "Math: 4.25 Literature: 7.50 Physics: 6.80 Chemitry: 6.00 Biology: 6.00"
Split es jeden space
oder : space
folgendes Vektor
y <- strsplit(x, ':\\s+|\\s+')[[1]]
y
#[1] "Math" "4.25" "Literature" "7.50" "Physics" "6.80" "Chemitry" "6.00" "Biology" "6.00"
Fügen Sie ihn zusammen zu bekommen, zuerst alle ersten Elemente (dh die Themen, y[c(TRUE, FALSE)]
) und dann alle zweiten Elemente (dh die Klassen y[c(FALSE, TRUE)]
), mit einem :
Separator
z <- paste0(y[c(T, F)], ': ', y[c(F, T)])
z
#[1] "Math: 4.25" "Literature: 7.50" "Physics: 6.80" "Chemitry: 6.00" "Biology: 6.00"
Schließlich gibt es eine sortierte (basierend auf den Worten sub(':.*', '', z)
) Vektor
z[order(sub(':.*', '', z))]
#[1] "Biology: 6.00" "Chemitry: 6.00" "Literature: 7.50" "Math: 4.25" "Physics: 6.80"
Wie @rosscova wies darauf hin, Strings müssen nicht sortiert werden, was diese viel vereinfacht (Funktion nicht benötigt wird, nachdem alle), dh
grade %>%
mutate(Grade = strsplit(Grade, '[0-9]\\s+')) %>%
unnest() %>%
separate(Grade, into = c('Subject', 'Grade'), sep = ': ') %>%
spread(Subject, Grade)
Vielen Dank @HNSKD. Das ist wirklich einfach zu verstehen – Tuyen