Ik heb een dataframe dat ik als zodanig construeer:
> yyz <- data.frame(a = c("1","2","n/a"), b = c(1,2,"n/a"))
> apply(yyz, 2, class)
a b
"character" "character"
Ik probeer de laatste kolom naar numeriek te converteren, terwijl ik de eerste kolom als teken behoud. Ik heb dit geprobeerd:
> yyz$b <- as.numeric(as.character(yyz$b))
> yyz
a b
1 1
2 2
n/a NA
Maar als ik de klasse Apply run, zie ik dat het beide karakterklassen zijn.
> apply(yyz, 2, class)
a b
"character" "character"
Stel ik het dataframe verkeerd in? Of is het de manier waarop R het dataframe interpreteert?
Antwoord 1, autoriteit 100%
Als we maar één kolom nodig hebben om numeric
te zijn
yyz$b <- as.numeric(as.character(yyz$b))
Maar als alle kolommen moeten worden gewijzigd in numeric
, gebruik dan lapply
om de kolommen te doorlopen en om te zetten in numeric
door eerst te converteren het naar de klasse character
aangezien de kolommen factor
waren.
yyz[] <- lapply(yyz, function(x) as.numeric(as.character(x)))
Beide kolommen in het bericht van het OP zijn factor
vanwege de string "n/a"
. Dit kan gemakkelijk worden vermeden tijdens het lezen van het bestand met behulp van na.strings = "n/a"
in de read.table/read.csv
of als we data.frame
, we kunnen character
kolommen hebben met stringsAsFactors=FALSE
(de standaard is stringsAsFactors=TRUE
)
Wat betreft het gebruik van apply
, het converteert de dataset naar matrix
en matrix
kan slechts één klasse bevatten. Om de class
te controleren, hebben we
. nodig
lapply(yyz, class)
Of
sapply(yyz, class)
Of controleer
str(yyz)