R удалить строки с наименьшим количеством на основе нескольких строк - PullRequest
0 голосов
/ 19 мая 2018

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

   Var1  Var2  Var3 Var4
1 Rank 1 Sub 1     0   10
2 Rank 1 Sub 1     0   20
3 Rank 2 Sub 2     0   30
4 Rank 1     0 Sub 1   40
5 Rank 2 Sub 2     0   50
6 Rank 2     0 Sub 2   10

Я хочу удалить строки с наименьшими значениями, основанные на Var2 и Var3.Например, ранг 1 (в Var1) имеет 2 значения в Var2 и 1 значение в Var3.Я хочу удалить все записи ранга 1, имеющие значение в Var3, и сохранить все записи, имеющие значение в Var2.То же самое относится ко всем другим значениям Var1.

Таким образом, конечный результат будет:

       Var1  Var2  Var3 Var4
    1 Rank 1 Sub 1     0   10
    2 Rank 1 Sub 1     0   20
    3 Rank 2 Sub 2     0   30
    4 Rank 2 Sub 2     0   50

Есть ли способ сделать это?найдите код для построения приведенной выше таблицы:

Var1 = c("Rank 1", "Rank 1", "Rank 2", "Rank 1", "Rank 2")
Var2 = c("Sub 1", "Sub 1", "Sub 2","0", "Sub 2")
Var3 = c(0, "Sub 1", 0, "Sub 1", "0" )
Var4 = c(10,20, 30, 40,50)
df <- data.frame(Var1,Var2,Var3,Var4)

PS: это будет очень большой набор данных с несколькими записями как в Var2, так и в Var3

Спасибо

1 Ответ

0 голосов
/ 19 мая 2018

Используйте пакет dplyr для группировки по Var1 для подсчета ненулевых значений для столбцов Var2 и Var3.На основании того, какое число больше, критерии filter могут применяться к соответствующим столбцам.case_when сделает логику проще и чище.

library(dplyr)
df %>% mutate_if(is.factor, as.character) %>%
  group_by(Var1) %>% 
  filter( case_when(
    sum(Var2 != "0") >= sum(Var3 != "0") ~ Var2 != "0",
    sum(Var2 != "0") < sum(Var3 != "0") ~ Var3 != "0"
      ))
    # # A tibble: 4 x 4
# # Groups: Var1 [2]
# Var1   Var2  Var3   Var4
# <chr>  <chr> <chr> <int>
# 1 Rank 1 Sub 1 0        10
# 2 Rank 1 Sub 1 0        20
# 3 Rank 2 Sub 2 0        30
# 4 Rank 2 Sub 2 0        50

Данные:

df <- read.table(text = 
"Var1  Var2  Var3 Var4
1 'Rank 1' 'Sub 1'     0   10
2 'Rank 1' 'Sub 1'     0   20
3 'Rank 2' 'Sub 2'     0   30
4 'Rank 1'     0 'Sub 1'   40
5 'Rank 2' 'Sub 2'     0   50
6 'Rank 2'     0 'Sub 2'   10",
stringsAsFactors = FALSE, header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...