J'ai la trame de données suivante:
> str(df)
'data.frame': 3149 obs. of 9 variables:
$ mkod : int 5029 5035 5036 5042 5048 5050 5065 5071 5072 5075 ...
$ mad : Factor w/ 65 levels "Akgün Kasetçilik ",..: 58 29 59 40 56 11 33 34 19 20 ...
$ yad : Factor w/ 44 levels "BAKUGAN","BARBIE",..: 1 1 1 1 1 1 1 1 1 1 ...
$ donem: int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ...
$ sayi : int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ...
$ plan : int 2 2 3 2 2 2 7 3 2 7 ...
$ sevk : int 2 2 3 2 2 2 6 3 2 7 ...
$ iade : int 0 0 3 1 2 2 6 2 2 3 ...
$ satis: int 2 2 0 1 0 0 0 1 0 4 ...
Je souhaite supprimer 21 lignes spécifiques de ce bloc de données.
> a <- df[df$plan==0 & df$sevk==0,]
> nrow(a)
[1] 21
Ainsi, lorsque je supprimerai ces 21 lignes, j'aurai un nouveau bloc de données avec 3149 - 21 = 3128 lignes. J'ai trouvé la solution suivante:
> b <- df[df$plan!=0 | df$sevk!=0,]
> nrow(b)
[1] 3128
Ma solution ci-dessus utilise une expression logique modifiée (!=
au lieu de ==
et |
au lieu de &
). Outre la modification de l'expression logique d'origine, comment puis-je obtenir le nouveau bloc de données sans ces 21 lignes? J'ai besoin de quelque chose comme ça:
> df[-a,] #does not work
EDIT (surtout pour les downvoters, j'espère qu'ils comprennent pourquoi j'ai besoin d'une solution alternative): J'ai demandé une solution différente car j'écris un long code , et il existe diverses affectations de variables (comme a
dans mon exemple) dans diverses parties de mon code. Ainsi, lorsque je dois supprimer des lignes dans des parties avancées de mon code, je ne veux pas revenir en arrière et essayer d'écrire l'inverse des expressions logiques dans les expressions de type a
. C'est pourquoi df[-a,]
est plus utilisable pour moi.
Vous pouvez utiliser le rownames
pour spécifier une trame de données "complémentaire". C'est plus facile s'il s'agit de noms numériques:
df[-as.numeric(rownames(a)),]
Mais plus généralement, vous pouvez utiliser:
df[setdiff(rownames(df),rownames(a)),]
Niez simplement votre indice logique:
a <- df[!(df$plan==0 & df$sevk==0),]
Recherchez-vous subset()
?
dat <- airquality
dat.sub <- subset(dat, Temp > 80 & Month < 10)
dim(dat)
dim(dat.sub)
Appliqué à votre exemple:
df.sub <- subset(df, plan != 0 & sevk != 0)
Tu y es presque. 'a' doit être un vecteur d'indices:
df <- data.frame(plan=runif(10),sevk=runif(10))
a <- c(df$plan<.1 | df$sevk < .1) # some logical thing
df[-a,]
ou, avec vos données:
a <- c(df$plan==0 & df$sevk==0)
df[-a,]
Je ne vois pas pourquoi vous vous opposez à votre solution, mais voici une autre façon.
which( df[df$plan==0 & df$sevk==0,], arr.ind=TRUE) ->killlist
newdf <- df[-c(killlist[1,])]