Удаление строк из фрейма данных R

#r #dataframe #rows

#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 amp; df$sevk==0,]
> nrow(a)
[1] 21
 

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

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

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

 > df[-a,] #does not work
 

РЕДАКТИРОВАТЬ (особенно для тех, кто голосует против, я надеюсь, они понимают, почему мне нужно альтернативное решение): Я попросил другое решение, потому что я пишу длинный код, и в разных частях моего кода есть различные назначения переменных (например, a ‘s в моем примере). Итак, когда мне нужно удалить строки в последующих частях моего кода, я не хочу возвращаться и пытаться написать обратное логическим выражениям внутри a подобных выражений. Вот почему df[-a,] для меня это более удобно.

Комментарии:

1. -1 У вас есть решение, содержащееся в вопросе. Нет никакой проблемы, которую нужно было бы решать (в том виде, в каком вопрос сформулирован в настоящее время).

2. @RichieCotton: В моем решении используется модифицированное (другое) логическое выражение, которое в итоге дает нужный мне результат; но я хочу увидеть, как удалить определенные строки из фрейма данных. Я включил свое решение в свой вопрос, потому что не хотел видеть его в ответах.

3. Я добавил несколько строк к своему вопросу, чтобы объяснить, что я хочу знать.

4. Я думаю, что есть путаница в том, почему вы хотите что-то вроде df[-a,] , когда df[df$plan!=0 | df$sevk!=0,] кажется правильным подходом. Не могли бы вы прокомментировать, почему в более широкой картине предпочтительнее что-то вроде df[-a,] ? Возможно, в более широкой картине существует подход, который позволяет избежать этой проблемы.

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

Ответ №1:

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

 a <- df[!(df$plan==0 amp; df$sevk==0),]
 

Ответ №2:

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

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

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

 df[setdiff(rownames(df),rownames(a)),]
 

Комментарии:

1. Конечно, это предполагает, что у вас есть имена строк, что в данном случае сделал OP, но это не общее решение

Ответ №3:

Вы ищете subset() ?

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

dim(dat)
dim(dat.sub)
 

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

 df.sub <- subset(df, plan != 0 amp; sevk != 0)
 

Комментарии:

1. Это то же самое, что и мое решение: df[df$plan!=0 | df$sevk!=0,] которое выбирает подмножество; но все равно спасибо.

2. Кстати, amp; оператор должен быть | (ИЛИ) оператором in subset(df, plan != 0 amp; 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 amp; df$sevk==0)
    df[-a,]
 

Комментарии:

1. Я попробовал последние две строки вашего кода с моими данными, но это дает неправильный результат (3148 строк вместо 3128). (Кстати, b[-a,] должно быть df[-a,] , я думаю)

2. извините за ошибку — это работает с моим автономным небольшим примером выше, поэтому я думаю, что все, что происходит с вашими данными, у меня над головой

Ответ №5:

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

 which( df[df$plan==0 amp; df$sevk==0,], arr.ind=TRUE) ->killlist 
newdf <- df[-c(killlist[1,])]