Ik probeer een Principal Components Analysis uit te voeren, maar ik krijg de foutmelding: Error in colMeans(x, na.rm = TRUE) : ‘x’ moet numeriek zijn
Ik weet dat alle kolommen numeriek moeten zijn, maar hoe ga je om met tekenobjecten in de dataset? Bijv.:
data(birth.death.rates.1966)
data2 <- birth.death.rates.1966
princ <- prcomp(data2)
- data2 voorbeeld van onderstaande gegevens:
Moet ik een nieuwe kolom toevoegen waarin de landnaam naar een numerieke code wordt verwezen? Zo ja, hoe doe je dit in R?
Antwoord 1, autoriteit 100%
Je kunt een tekenvector converteren naar numerieke waarden door via factor
te gaan. Elke unieke waarde krijgt dan een unieke integercode. In dit voorbeeld zijn er vier waarden, dus de cijfers zijn 1 tot 4, in alfabetische volgorde, denk ik:
> d = data.frame(country=c("foo","bar","baz","qux"),x=runif(4),y=runif(4))
> d
country x y
1 foo 0.84435112 0.7022875
2 bar 0.01343424 0.5019794
3 baz 0.09815888 0.5832612
4 qux 0.18397525 0.8049514
> d$country = as.numeric(as.factor(d$country))
> d
country x y
1 3 0.84435112 0.7022875
2 1 0.01343424 0.5019794
3 2 0.09815888 0.5832612
4 4 0.18397525 0.8049514
U kunt dan prcomp
uitvoeren:
> prcomp(d)
Standard deviations:
[1] 1.308665216 0.339983614 0.009141194
Rotation:
PC1 PC2 PC3
country -0.9858920 0.132948161 -0.101694168
x -0.1331795 -0.991081523 -0.004541179
y -0.1013910 0.009066471 0.994805345
Of dit zinvol is voor uw toepassing, is aan u. Misschien wil je gewoon de eerste kolom laten vallen: prcomp(d[,-1])
en werken met de numerieke gegevens, wat lijkt te zijn wat de andere “antwoorden” proberen te bereiken.
Antwoord 2, autoriteit 25%
De eerste kolom van het dataframe is teken. U kunt het dus hercoderen naar rijnamen als:
library(tidyverse)
data2 %>% remove_rownames %>% column_to_rownames(var="country")
princ <- prcomp(data2)
Alternatief als :
data2 <- data2[,-1]
rownames(data2) <- data2[,1]
princ <- prcomp(data2)
Antwoord 3
In R maakt het toevoegen van de factormethode aan een tekenset van gegevens het niet numeriek.
Het is inderdaad bedoeld om van ons machine learning-model een wiskundig model te maken, maar het zijn geen numerieke gegevens.
Voorbeeld: als u een lijst met namen heeft en deze numeriek worden gecodeerd, kan het gebeuren dat een bepaalde naam een hogere numerieke waarde heeft, waardoor deze een andere definitie krijgt, afhankelijk van ons model.
Wat niet het geval zou moeten zijn, aangezien namen (tekstgegevens die alleen bedoeld zijn om een specifieke set te labelen) over het algemeen niet zouden moeten definiëren hoe een model zou moeten werken.
Ook als u met deze gegevens probeert te werken in de veronderstelling dat het numeriek is, kunt u de volgende foutmelding krijgen:
Fout in colMeans(x, na.rm = TRUE): ‘x’ moet numeriek zijn
Ik heb hierboven gedefinieerd waarom u deze foutmelding kunt krijgen
Om dit probleem op te lossen
training_set[,2:3] = scale(training_set)
test_set[,2:3] = scale(test_set)
In de volgende afbeelding hebben kolommen 1 en 4 gecodeerde gegevens en kunnen ze niet worden behandeld als een numeriek model. Kolommen 2 en 3 bevatten oorspronkelijk numerieke gegevens, dus we kunnen ons model alleen op dat deel van de gegevens uitvoeren. De bovenstaande code laat zien hoe u de gegevens selecteert, deze bevat alle rijen en kolommen 2 en 3