Удаление строк из кадра данных R
У меня есть следующий фрейм данных:
> 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,]
более полезен для меня.
Ответы
Ответ 1
Вы можете использовать rownames
для указания "дополнительного" кадра данных. Его проще, если они являются числовыми именами ростов:
df[-as.numeric(rownames(a)),]
Но в целом вы можете использовать:
df[setdiff(rownames(df),rownames(a)),]
Ответ 2
Просто отрицайте свой логический индекс:
a <- df[!(df$plan==0 & df$sevk==0),]
Ответ 3
Вы ищете subset()
?
dat <- airquality
dat.sub <- subset(dat, Temp > 80 & Month < 10)
dim(dat)
dim(dat.sub)
Применяется к вашему примеру:
df.sub <- subset(df, plan != 0 & sevk != 0)
Ответ 4
Ты почти там. "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,]
Ответ 5
Я не понимаю, почему вы возражаете против своего решения, но здесь по-другому.
which( df[df$plan==0 & df$sevk==0,], arr.ind=TRUE) ->killlist
newdf <- df[-c(killlist[1,])]