R Fout in x$ed: $ operator is ongeldig voor atoomvectoren

Hier is mijn code:

x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed

Waarom krijg ik de volgende foutmelding?

Fout in x$ed: $ operator is ongeldig voor atomaire vectoren


Antwoord 1, autoriteit 100%

Uit het helpbestand over $(Zie ?"$") kun je lezen:

$ is alleen geldig voor recursieve objecten en wordt alleen besproken in het onderstaande gedeelte over recursieve objecten.

Laten we nu eens kijken of xrecursief is

> is.recursive(x)
[1] FALSE

Een recursief object heeft een lijstachtige structuur. Een vector is niet recursief, het is in plaats daarvan een atomair object, laten we eens kijken

> is.atomic(x)
[1] TRUE

Daarom krijg je een foutmelding bij het toepassen van $op een vector (niet-recursief object), gebruik in plaats daarvan [:

> x["ed"]
ed 
 2 

U kunt ook getElement

. gebruiken

> getElement(x, "ed")
[1] 2

Antwoord 2, autoriteit 39%

De reden dat je deze foutmelding krijgt is dat je een vectorhebt.

Als u de operator $wilt gebruiken, hoeft u deze alleen maar te converteren naar een data.frame. Maar aangezien je in dit specifieke geval maar één rij hebt, zou je deze ook moeten transponeren; anders worden boben edje rijnamen in plaats van je kolomnamen, wat ik denk dat je wilt.

x <- c(1, 2)
x
names(x) <- c("bob", "ed")
x <- as.data.frame(t(x))
x$ed
[1] 2

Antwoord 3, autoriteit 12%

Omdat $niet werkt op atomaire vectoren. Gebruik in plaats daarvan [of [[]. Uit het helpbestand voor $:

De standaardmethoden werken iets anders voor atomaire vectoren, matrices/arrays en voor recursieve (lijstachtige, zie is.recursive) objecten. $ is alleen geldig voor recursieve objecten en wordt alleen besproken in de sectie hieronder over recursieve objecten.

x[["ed"]]zal werken.


Antwoord 4, autoriteit 4%

Hier is x een vector.
U moet het converteren naar een dataframe om de $ operator te gebruiken.

x <- as.data.frame(x) 

zal voor u werken.

x<-c(1,2)
names(x)<- c("bob","ed")
x <- as.data.frame(x)

geeft u uitvoer van x als:

bob 1
ed 2

En, je krijgt een output van x$ed als:
NULL
Als u bob en ed als kolomnamen wilt, moet u het dataframe transponeren zoals x <- as.data.frame(t(x))
Dus je code wordt

x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
x <- as.data.frame(t(x))

De output van x$ed is nu:
[1] 2


Antwoord 5

Je krijgt deze foutmelding, ondanks dat alles in lijn is, vanwege een conflict veroorzaakt door een van de pakketten die momenteel in je R-omgeving zijn geladen.

Dus, om dit probleem op te lossen, ontkoppel alle pakketten die niet nodig zijn van de R-omgeving. Toen ik bijvoorbeeld hetzelfde probleem had, deed ik het volgende:

detach(package:neuralnet)

bottom line: ontkoppel alle bibliotheken die niet langer nodig zijn voor uitvoering… en het probleem zal worden opgelost.


Antwoord 6

Deze oplossing werkte voor mij
data<- transform(data, ColonName =as.integer(ColonName))


Antwoord 7

Atomic-collecties zijn toegankelijk via $

Recursieve verzamelingen zijn dat niet. In plaats daarvan wordt de [[ ]]gebruikt

Browse[1]> is.atomic(list())
 [1] FALSE
 Browse[1]> is.atomic(data.frame())
 [1] FALSE
 Browse[1]> is.atomic(class(list(foo="bar")))
 [1] TRUE
 Browse[1]> is.atomic(c(" lang "))
 [1] TRUE

R kan soms grappig zijn

a = list(1,2,3)
 b = data.frame(a)
 d = rbind("?",c(b))
 e = exp(1)
 f = list(d)
 print(data.frame(c(list(f,e))))
   X1 X2 X3 X2.71828182845905
 1  ?  ?  ?          2.718282
 2  1  2  3          2.718282

Other episodes