Dataframekolom converteren van teken naar numeriek

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 lapplyom de kolommen te doorlopen en om te zetten in numericdoor eerst te converteren het naar de klasse characteraangezien de kolommen factorwaren.

yyz[] <- lapply(yyz, function(x) as.numeric(as.character(x)))

Beide kolommen in het bericht van het OP zijn factorvanwege 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.csvof als we data.frame, we kunnen characterkolommen hebben met stringsAsFactors=FALSE(de standaard is stringsAsFactors=TRUE)


Wat betreft het gebruik van apply, het converteert de dataset naar matrixen matrixkan slechts één klasse bevatten. Om de classte controleren, hebben we

. nodig

lapply(yyz, class)

Of

sapply(yyz, class)

Of controleer

str(yyz)

Other episodes