Совпадение и удаление строк на основе условия R - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть интересный для всех вас.

Сначала я посмотрю: просмотрите столбец идентификатора и определите повторяющиеся значения. Как только они идентифицированы, код должен пройти через доход от дублированных значений и сохранить строку с большим доходом.

Таким образом, если есть три значения идентификатора 2, он будет искать тот, который имеет самый высокий доход, и сохранит эту строку.

ID	Income
1	98765
2	3456
2	67
2	5498
5	23
6	98
7	5645
7	67871
9	983754
10	982
10	2374
10	875
10	4744
11	6853

Я знаю, что это так же просто, как подмножество, основанное на условии, но я не знаю, как удалить строки, основываясь на том, что доход в одной ячейке больше, чем в другой (выполняется только при совпадении идентификатора)

Я думал об использовании оператора ifelse для создания нового столбца, чтобы идентифицировать дубликаты (путем поднабора или нет), а затем снова использовать значения нового столбца, чтобы ifelse идентифицировать больший доход. Оттуда я могу просто подмножество на основе новых столбцов, которые я создал.

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

Результат должен выглядеть следующим образом.

ID	Income
1	98765
2	5498
5	23
6	98
7	67871
9	983754
10	4744
11	6853

Спасибо

Ответы [ 5 ]

0 голосов
/ 09 сентября 2018

Вот еще один dplyr метод. Мы можем расположить столбец, а затем нарезать фрейм данных для первой строки.

library(dplyr)

df2 <- df %>%
  arrange(ID, desc(Income)) %>%
  group_by(ID) %>%
  slice(1) %>%
  ungroup()
df2
# # A tibble: 8 x 2
#      ID Income
#   <int>  <int>
# 1     1  98765
# 2     2   5498
# 3     5     23
# 4     6     98
# 5     7  67871
# 6     9 983754
# 7    10   4744
# 8    11   6853

DATA

df <- read.table(text = "ID Income
1   98765
2   3456
2   67
2   5498
5   23
6   98
7   5645
7   67871
9   983754
10  982
10  2374
10  875
10  4744
11  6853",
                 header = TRUE)
0 голосов
/ 07 сентября 2018

Использование sqldf: сгруппировать по ID и выбрать соответствующий max Income

library(sqldf)
sqldf("select ID,max(Income) from df group by ID")

Выход:

  ID max(Income)
1  1       98765
2  2        5498
3  5          23
4  6          98
5  7       67871
6  9      983754
7 10        4744
8 11        6853
0 голосов
/ 07 сентября 2018

order с duplicated (база R)

df=df[order(df$ID,-df$Income),]
df[!duplicated(df$ID),]
   ID Income
1   1  98765
4   2   5498
5   5     23
6   6     98
8   7  67871
9   9 983754
13 10   4744
14 11   6853
0 голосов
/ 07 сентября 2018

Group_by и суммирование из dplyr тоже будет работать

df1 %>% 
  group_by(ID) %>% 
  summarise(Income=max(Income))

     ID  Income
  <int>   <dbl>
1     1  98765.
2     2   5498.
3     5     23.
4     6     98.
5     7  67871.
6     9 983754.
7    10   4744.
8    11   6853.
0 голосов
/ 07 сентября 2018

Мы можем slice строк, проверив наибольшее значение в «Доход», сгруппированных по «ID»

library(dplyr)
df1 %>%
  group_by(ID) %>%
  slice(which.max(Income))

Или используя data.table

library(data.table)
setDT(df1)[, .SD[which.max(Income)], by = ID]

Или с base R

df1[with(df1, ave(Income, ID, FUN = max) == Income),]
#     ID Income
#1   1  98765
#4   2   5498
#5   5     23
#6   6     98
#8   7  67871
#9   9 983754
#13 10   4744
#14 11   6853

данные

df1 <- structure(list(ID = c(1L, 2L, 2L, 2L, 5L, 6L, 7L, 7L, 9L, 10L, 
10L, 10L, 10L, 11L), Income = c(98765L, 3456L, 67L, 5498L, 23L, 
98L, 5645L, 67871L, 983754L, 982L, 2374L, 875L, 4744L, 6853L)), 
class = "data.frame", row.names = c(NA, 
-14L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...