web-dev-qa-db-fra.com

Suppression de lignes du bloc de données R

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.

22

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)),]
12
James

Niez simplement votre indice logique:

a <- df[!(df$plan==0 & df$sevk==0),]
15
Joshua Ulrich

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)
9
jthetzel

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,]
2
tim riffe

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,])] 
0
Carl Witthoft