Edit: war es ein Tippfehler in meiner df
Schöpfung, mit einer fehlenden _
auf dem letzten Wert von MediaName
; Das ist jetzt korrigiert.strsplit innerhalb dplyr Mit :: mutieren (ohne tibble :: data_frame) wirft "Evaluation Fehler: Nicht-Zeichen-Argument"
Ich möchte eine neue Variable TrialId
in einem Datenrahmen als Teil des Wertes einer anderen Variablen MediaName
erstellen, die auf den Wert einer dritten Variablen Phase
abhängig, und dachte, ich könnte, dass innerhalb eines dplyr::mutate
strsplit
und ifelse
mit tun wie folgt :
library(dplyr)
# Creating a simple data frame for the example
df <- data.frame(Phase = c(rep("Familiarisation",8),rep("Test",3)),
MediaName = c("Flip_A1_G1","Reg_B2_S1","Reg_A2_G1","Flip_B1_S1",
"Reg_A1_G2","Flip_B2_S2","Reg_A2_G2","Flip_B1_S2",
"HC_A1L","TC_B1R","RC_BL_2R"))
# Creating a new column
df <- df %>%
mutate(TrialId = ifelse(Phase == "Familiarisation",
sapply(strsplit(MediaName, "_"), "[", 2),
sapply(strsplit(MediaName, "_"), "[", 1)))
Das erwartete Ergebnis ist
> df$TrialId
[1] "A1" "B2" "A2" "B1" "A1" "B2" "A2" "B1" "HC" "TC" "RC"
jedoch gibt dies mir die folgende Fehlermeldung, weil ich glaube, die strsplit
:
Error in mutate_impl(.data, dots) :
Evaluation error: non-character argument.
Ich weiß aus this SO question, dass ich einfach mein Problem durch die Definition lösen kann, in diesem kleinen Beispiel, meinen Datenrahmen als tibble::data_frame
, ohne zu wissen, warum dies das Problem löst. Ich kann nicht genau das tun, da in meinem tatsächlichen Code df
kommt aus dem Lesen einer CSV-Datei (mit read.csv()
). Ich habe gedacht, dass die Verwendung df <- df %>% as_tibble() %>% mutate(...)
das Problem in ähnlicher Weise lösen würde, aber es nicht (warum?).
Gibt es eine Möglichkeit, tibble
auch beim Lesen von Dateien zu verwenden? Oder gibt es einen anderen Weg zu erreichen, was ich tun muss, ohne strsplit
vielleicht zu verwenden?
lese ich auch auf this other SO question, die Sie tidyr::separate
verwenden können, aber es ist nicht genau das tun, was ich will, wie ich halten müssen entweder den ersten oder zweiten Wert auf den Wert von Phase
abhängig.
Vielleicht haben Sie 'Faktor' Klasse. Versuchen Sie, in 'character' zu konvertieren und machen Sie dann' ifelse', d. H. 'Df%>% mutate_all (als.Zeichen)%>% 'vor dem' muate' Aufruf – akrun
Verdammt, das fühlte sich so offensichtlich an, dass ich es nicht einmal probiert habe, aber es funktioniert ... Ich bin immer noch daran interessiert zu verstehen, warum 'tibble :: data_frame' verwendet wird macht es aber nicht 'as_tibble' verwenden. –
Der Hauptgrund ist, dass 'data_frame' standardmäßig' character' Klasse für alle diese nicht numerischen Spalten liefert, während 'data.frame' standardmäßig' stringsAsFactors = TRUE' ist. und da Sie 'as_tibble' verwenden, wird die durch 'data.frame' erzeugte Spaltenklasse nicht geändert. – akrun