Сохранять менее повторяющиеся повторяющиеся строки в R - PullRequest
0 голосов
/ 28 декабря 2018

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

Например, если набор данных теперь выглядит следующим образом:

Bill Number   Day   Month    Year   Ag. Value
   1           10     4       1998     10
   1           11     4       1998     14
   2           23     11      2001     12
   2           23     11      2001     9
   3           11     3       2005     8
   3           12     3       2005     9
   3           13     3       2005     4

Я хочу, чтобы результат выглядел следующим образом:

Bill Number  Day  Month  Year  Ag. Value
    1         10    4     1998    10
    2         23    11    2001    12
    3         11    3     2005    8

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

Спасибо!

Ответы [ 4 ]

0 голосов
/ 31 декабря 2018

Я использовал несколько циклов и проверок условий и попробовал использовать набор тестов, кроме упомянутого вами «базового» набора.

library(tidyverse)

#base dataset
billNumber <- c(1,1,2,2,3,3,3)
day <- c(10,11,23,23,11,12,13)
month <- c(4,4,11,11,3,3,3)
year <- c(1998,1998,2001,2001,2005,2005,2005)
agValue <- c(10,14,12,9,8,9,4)

#test dataset
billNumber <- c(1,1,2,2,3,3,3,4,4,4)
day <- c(10,11,23,23,11,12,13,15,15,15)
month <- c(4,4,11,11,3,3,3,6,6,6)
year <- c(1998,1998,2001,2001,2005,2005,2005,2020,2020,2020)
agValue <- c(10,14,9,12,8,9,4,13,15,8)

#build the dataset
df <- data.frame(billNumber,day,month,year,agValue)

#add a couple of working columns
df_full <- df %>%
  mutate(
    concat = paste(df$billNumber,df$day,df$month,df$year,sep="-"),
    flag = ""
  )

df_full

billNumber day month year agValue       concat flag
1          1  10     4 1998      10  1-10-4-1998     
2          1  11     4 1998      14  1-11-4-1998     
3          2  23    11 2001      12 2-23-11-2001     
4          2  23    11 2001       9 2-23-11-2001     
5          3  11     3 2005       8  3-11-3-2005     
6          3  12     3 2005       9  3-12-3-2005     
7          3  13     3 2005       4  3-13-3-2005     

#separate records with one/multi occurence as defined in the question
row_single <- df_full %>% count(concat) %>% filter(n == 1)
df_full_single <- df_full[df_full$concat %in% row_single$concat,]

row_multi <- df_full %>% count(concat) %>% filter(n > 1)
df_full_multi <- df_full[df_full$concat %in% row_multi$concat,]

#flag the rows with single occurence
df_full_single[1,]$flag = "Y"

for (row in 2:nrow(df_full_single)) {

  if (df_full_single[row,]$billNumber == df_full_single[row-1,]$billNumber) {
    df_full_single[row,]$flag = "N"    
  } else 
  {
    df_full_single[row,]$flag = "Y"
  }
}

df_full_single


#flag the rows with multi occurences
df_full_multi[1,]$flag = "Y"

for (row in 2:nrow(df_full_multi)) {

  if (
      (df_full_multi[row,]$billNumber == df_full_multi[row-1,]$billNumber) &
      (df_full_multi[row,]$agValue > df_full_multi[row-1,]$agValue)
     ) {
    df_full_multi[row,]$flag = "Y"    
    df_full_multi[row-1,]$flag = "N"
  } else 
  {
    df_full_multi[row,]$flag = "N"
  }
}

df_full_multi

#rebuild full dataset and retrieve the desired output

df_full_final <- rbind(df_full_single,df_full_multi)

df_full_final <- df_full_final[df_full_final$flag == "Y",c(1,2,3,4,5)]

df_full_final <- df_full_final[order(df_full_final$billNumber),]

df_full_final

billNumber day month year agValue
1          1  10     4 1998      10
3          2  23    11 2001      12
5          3  11     3 2005       8
0 голосов
/ 28 декабря 2018
library( data.table )

dt <- fread("Bill_Number   Day   Month    Year   Ag_Value
1           10     4       1998     10
1           11     4       1998     14
2           23     11      2001     12
2           23     11      2001     9
3           11     3       2005     8
3           12     3       2005     9
3           13     3       2005     4", header = TRUE)

dt[ !duplicated( Bill_Number), ]  

#    Bill_Number Day Month Year Ag_Value
# 1:           1  10     4 1998       10
# 2:           2  23    11 2001       12
# 3:           3  11     3 2005        8

или

dt[, .SD[1], by = .(Bill_Number) ]  #other approach, a bit slower
0 голосов
/ 29 декабря 2018

Этот ответ использует пакет dplyr и удовлетворяет вашему условию: " Если есть дубликат с тем же днем, месяцем и годом, я хочу сохранить один с наибольшим количеством в совокупном значении."

library(data.table)
library(dplyr)

myData <- fread("Bill_Number   Day   Month    Year   Ag_Value
        1           10     4       1998     10
        1           11     4       1998     14
        2           23     11      2001     12
        2           23     11      2001     9
        3           11     3       2005     8
        3           12     3       2005     9
        3           13     3       2005     4", header = TRUE)

myData <- as.tibble(myData) #tibble form
sData <- arrange(myData, Bill_Number, Year, Month, Day, desc(Ag_Value)) #sort the data with the required manner 
fData <- distinct(sData, Bill_Number, .keep_all = 1) #final data
fData
# A tibble: 3 x 5
  Bill_Number   Day Month  Year Ag_Value
       <int> <int> <int> <int>    <int>
1           1    10     4  1998       10
2           2    23    11  2001       12
3           3    11     3  2005        8
0 голосов
/ 28 декабря 2018

duplicated () дает вам записи, которые идентичны предыдущим (т. Е. Записи с меньшим количеством подписок).Поэтому сортировка номеров ваших счетов по дате (самая ранняя к началу) и последующее удаление дубликатов должны помочь.Может быть полезным объединение ваших столбцов день, месяц и год в один столбец даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...