Удаление строк из фрейма данных R - PullRequest
22 голосов
/ 27 октября 2011

У меня есть следующий фрейм данных:

> 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 ...

Я хочу удалить 21 конкретную строку из этого фрейма данных.

> a <- df[df$plan==0 & df$sevk==0,]
> nrow(a)
[1] 21

Поэтому, когда я удалю эти 21 строку, я будуновый фрейм данных с 3149 - 21 = 3128 строк.Я нашел следующее решение:

> b <- df[df$plan!=0 | df$sevk!=0,]
> nrow(b)
[1] 3128

Мое вышеупомянутое решение использует измененное логическое выражение (!= вместо == и | вместо &).Кроме изменения исходного логического выражения, как я могу получить новый фрейм данных без этих 21 строки?Мне нужно что-то вроде этого:

> df[-a,] #does not work

EDIT (особенно для downvoters, я надеюсь, что они понимают, почему мне нужно альтернативное решение): я попросил другое решение, потому что яписать длинный код, и в различных частях моего кода есть различные назначения переменных (например, a в моем примере).Поэтому, когда мне нужно удалить строки в продвигающихся частях моего кода, я не хочу возвращаться и пытаться записать инверсию логических выражений внутри a -подобных выражений.Вот почему df[-a,] более полезен для меня.

Ответы [ 5 ]

15 голосов
/ 27 октября 2011

Просто отрицайте свой логический индекс:

a <- df[!(df$plan==0 & df$sevk==0),]
12 голосов
/ 27 октября 2011

Вы можете использовать rownames, чтобы указать «дополнительный» фрейм данных.Это проще, если они представляют собой числовые имена строк:

df[-as.numeric(rownames(a)),]

Но в целом вы можете использовать:

df[setdiff(rownames(df),rownames(a)),]
9 голосов
/ 27 октября 2011

Вы ищете subset()?

dat <- airquality
dat.sub <- subset(dat, Temp > 80 & Month < 10)

dim(dat)
dim(dat.sub)

Применительно к вашему примеру:

df.sub <- subset(df, plan != 0 & sevk != 0)
2 голосов
/ 27 октября 2011

Ты почти у цели. 'a' должен быть вектором индексов:

    df <- data.frame(plan=runif(10),sevk=runif(10))
    a <- c(df$plan<.1 | df$sevk < .1) # some logical thing
    df[-a,]

или, с вашими данными:

    a <- c(df$plan==0 & df$sevk==0)
    df[-a,]
0 голосов
/ 27 октября 2011

Я не понимаю, почему вы возражаете против своего решения, но вот другой способ.

which( df[df$plan==0 & df$sevk==0,], arr.ind=TRUE) ->killlist 
newdf <- df[-c(killlist[1,])] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...