Фильтр и заказ с базой R не работает - PullRequest
1 голос
/ 02 марта 2020

У меня есть таблица (как data.frame), которая выглядит следующим образом:

     Var1            Var2 Freq
364    NI           taq  100
363    BB           taq   47
323    AA           ret   46
361    99           taq   33
360    88           taq   69
138    77           esc   111
358    66           taq   26
357    55           taq   23
356    44           taq   20
355    33           taq   143
354    22           taq   105
314   1212          ret   66
352    11           taq   114

Я хочу удалить "NI" из Var1 и упорядочить Freq от наивысшего к наименьшему. Теоретически это может быть сделано с

(df <- df[!df$Var1="NI" & order(df$Freq, decreasing=TRUE),])

Но я получаю это:

    Var1           Var2 Freq
363    BB           taq   47
323    AA           ret   46
361    99           taq   33
360    88           taq   69
138    77           esc  111
358    66           taq   26
357    55           taq   23
356    44           taq   20
355    33           taq  143
354    22           taq  105
314   1212          ret   66
352    11           taq  114

NI удален, но Freq не упорядочен, как ожидалось. Я что-то пропустил? Заранее спасибо

PS: Я ищу решение с базовым R.

Ответы [ 4 ]

5 голосов
/ 02 марта 2020

Мы можем filter сначала строки и затем arrange

library(dplyr)
df %>% 
     filter(Var1 != "NI") %>%
      arrange(desc(Freq))

В base R, subset сначала строки и затем order на основе 'Freq'

df1 <- subset(df, Var1 != "NI")
df1[order(df1$Freq, decreasing = TRUE),]
3 голосов
/ 02 марта 2020

Вы должны сделать это в 2 шага:

df = df[-(df$var1=="NI"),]
> df
   var1 var2 freq
3    BB  taq   47
4    AA  ret   46
5    99  taq   33
6    88  taq   69
7    77  esc  111
8    66  taq   26
9    55  taq   23
10   44  taq   20
11   33  taq  143
12   22  taq  105
13 1212  ret   66
14   11  taq  114
> df[order(df$freq, decreasing = T),]
   var1 var2 freq
11   33  taq  143
14   11  taq  114
7    77  esc  111
12   22  taq  105
6    88  taq   69
13 1212  ret   66
3    BB  taq   47
4    AA  ret   46
5    99  taq   33
8    66  taq   26
9    55  taq   23
10   44  taq   20
1 голос
/ 02 марта 2020

На самом деле вы можете сначала упорядочить строки по Freq, а затем отфильтровать строки, которые Var1 != "NI", так как фильтрация не повлияет на порядок убывания.

В этом случае ваш код может быть написано компактно (не нужно двух шагов), т. е.

dfout <- subset(df[order(df$Freq,decreasing = TRUE),],Var1!="NI")

так, чтобы

> dfout
    Var1 Var2 Freq
355   33  taq  143
352   11  taq  114
138   77  esc  111
354   22  taq  105
360   88  taq   69
314 1212  ret   66
363   BB  taq   47
323   AA  ret   46
361   99  taq   33
358   66  taq   26
357   55  taq   23
356   44  taq   20

DATA

df <- structure(list(Var1 = c("NI", "BB", "AA", "99", "88", "77", "66", 
"55", "44", "33", "22", "1212", "11"), Var2 = c("taq", "taq", 
"ret", "taq", "taq", "esc", "taq", "taq", "taq", "taq", "taq", 
"ret", "taq"), Freq = c(100L, 47L, 46L, 33L, 69L, 111L, 26L, 
23L, 20L, 143L, 105L, 66L, 114L)), class = "data.frame", row.names = c("364", 
"363", "323", "361", "360", "138", "358", "357", "356", "355", 
"354", "314", "352"))
0 голосов
/ 02 марта 2020

Не вижу здесь проблемы, за исключением того, что ваш код написан неправильно:

df[df$Var1 != "NI" & order(df$Freq, decreasing=TRUE),]
...