Voici mon code:
x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
Pourquoi ai-je l'erreur suivante?
Erreur dans x $ ed: l'opérateur $ n'est pas valide pour les vecteurs atomiques
Dans le fichier d’aide relatif à $
(voir ?"$"
), vous pouvez lire:
$ n'est valide que pour les objets récursifs et n'est discuté que dans la section ci-dessous sur les objets récursifs.
Maintenant, vérifions si x
est récursif
> is.recursive(x)
[1] FALSE
Un objet récursif a une structure semblable à une liste. Un vecteur n'est pas récursif, c'est un objet atomique à la place, vérifions
> is.atomic(x)
[1] TRUE
Par conséquent, vous obtenez une erreur lorsque vous appliquez $
à un vecteur (objet non-récursif), utilisez plutôt [
:
> x["ed"]
ed
2
Vous pouvez également utiliser getElement
> getElement(x, "ed")
[1] 2
La raison pour laquelle vous obtenez cette erreur est que vous avez un vector
.
Si vous souhaitez utiliser l'opérateur $
, il vous suffit de le convertir en un fichier data.frame
. Mais comme vous n'avez qu'une seule ligne dans ce cas particulier, vous devez également la transposer. sinon, bob
et ed
deviendront vos noms de ligne au lieu de vos noms de colonne, ce que je pense que vous voulez.
x <- c(1, 2)
x
names(x) <- c("bob", "ed")
x <- as.data.frame(t(x))
x$ed
[1] 2
Parce que $
ne fonctionne pas sur les vecteurs atomiques. Utilisez [
ou [[
à la place. Dans le fichier d'aide pour $
:
Les méthodes par défaut fonctionnent de manière quelque peu différente pour les vecteurs atomiques, les matrices/tableaux et les objets récursifs (de type liste, voir is.recursive). $ n'est valide que pour les objets récursifs et n'est discuté que dans la section ci-dessous sur les objets récursifs.
x[["ed"]]
fonctionnera.
Vous obtenez cette erreur, malgré le fait que tout soit en ligne, à cause d'un conflit causé par l'un des packages actuellement chargés dans votre environnement R.
Donc, pour résoudre ce problème, détachez tous les packages inutiles de l'environnement R. Par exemple, quand j'ai eu le même problème, j'ai fait ce qui suit:
detach(package:neuralnet)
ligne de fond: détachez toutes les bibliothèques dont vous n'avez plus besoin pour l'exécution ... et le problème sera résolu.
Ici, x est un vecteur. Vous devez le convertir en un cadre de données pour utiliser l'opérateur $.
x <- as.data.frame(x)
travaillera pour vous.
x<-c(1,2)
names(x)<- c("bob","ed")
x <- as.data.frame(x)
vous donnera la sortie de x comme:
bob 1
ed 2
Et, vous obtiendrez une sortie de x $ ed sous la forme:
NUL
Si vous voulez les noms de colonne bob et ed, vous devez alors transposer le cadre de données comme x <- as.data.frame(t(x))
Pour que votre code devienne
x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
x <- as.data.frame(t(x))
Maintenant, la sortie de x $ ed est:
[1] 2