R:根据条件保持行重复(多列)

时间:2018-05-25 12:57:14

标签: r duplicates

基本上我想: 如果在某些特定列的组合上重复行,则只保留另一列上具有最低值的行。

示例数据(我的实际数据中存在更多差异):

ID  BilagNr Henstand    Aftale  Belob   RP  Pos Dps Udlign  rykkedage
1   111     01-01-2017   1111   100     YA   1   1               10
1   122     02-01-2017   1222   100     YA   1        1          40
1   111     01-07-2017   1111   100     YA   1   1              100
2   222     01-01-2017   2121   299     YA   1        4          5
2   222     01-01-2017   2121   299     YA   1        4          98
2   212     01-05-2017   7654   299     BS   1                   3
3   333     01-08-2017   7654   345     BS   2                   45
4   444     01-01-2017   7654   345     BS   3   1    4          68
4   411     09-01-2017   7654   345     BS   1        4          43
5   555     01-01-2017   5555   700     BS   1                   13
5   555     01-01-2017   5555   700     BS   1                   67
6   666     01-01-2017   4720   100     BS   1                   23
6   666     03-01-2017   1234   100     BS   2        1          23
6   666     07-08-2017   1234   120     BS   3   1    1          23
7   777     01-01-2017   1234   90      BS   1        1          23
7   777     01-01-2017   1234   90      BS   1        1         199

所以我只想保留这些:

ID  BilagNr Henstand    Aftale  Belob   RP  Pos Dps Udlign  rykkedage
1   111     01-01-2017   1111   100     YA   1   1               10
1   122     02-01-2017   1222   100     YA   1        1          40
2   222     01-01-2017   2121   299     YA   1        4          5
2   212     01-05-2017   7654   299     BS   1                   3
3   333     01-08-2017   7654   345     BS   2                   45
4   444     01-01-2017   7654   345     BS   3   1    4          68
4   411     09-01-2017   7654   345     BS   1        4          43
5   555     01-01-2017   5555   700     BS   1                   13
6   666     01-01-2017   4720   100     BS   1                   23
6   666     03-01-2017   1234   100     BS   2        1          23
6   666     07-08-2017   1234   120     BS   3   1    1          23
7   777     01-01-2017   1234   90      BS   1        1          23

换句话说:

如果行 ID,BilagNr,Henstand,Aftale,Belob,RP,Pos,Dps,Udlign 的组合重复,则< / em>只保留其中一个重复行,并从 rykkedage 必须是重复行的最小的条件中选择此项。

我希望这是有道理的。

Maybe this photo will help

此外,是否可以添加一个代码来保存rykkedage中具有相同值的重复行?我有一个大型数据集,我不确定这是否是一个问题。

谢谢!

1 个答案:

答案 0 :(得分:4)

我们可以按'ID','BilagNr',...,'Udlign'分组,然后slice分组'rykkedage'中最小值的索引

library(dplyr)
df1 %>%
   group_by(ID, BilagNr, Henstand, Aftale, Belob, RP, Pos, Dps, Udlign) %>%
   slice(which.min(rykkedage))
# A tibble: 13 x 10
# Groups:   ID, BilagNr, Henstand, Aftale, Belob, RP, Pos, Dps, Udlign [13]
#      ID BilagNr Henstand   Aftale Belob RP      Pos   Dps Udlign rykkedage
#   <int>   <int> <chr>       <int> <int> <chr> <int> <int>  <int>     <int>
# 1     1     111 01-01-2017   1111   100 YA        1     1     NA        10
# 2     1     111 01-07-2017   1111   100 YA        1     1     NA       100
# 3     1     122 02-01-2017   1222   100 YA        1    NA      1        40
# 4     2     212 01-05-2017   7654   299 BS        1    NA     NA         3
# 5     2     222 01-01-2017   2121   299 YA        1    NA      4         5
# 6     3     333 01-08-2017   7654   345 BS        2    NA     NA        45
# 7     4     411 09-01-2017   7654   345 BS        1    NA      4        43
# 8     4     444 01-01-2017   7654   345 BS        3     1      4        68
# 9     5     555 01-01-2017   5555   700 BS        1    NA     NA        13
#10     6     666 01-01-2017   4720   100 BS        1    NA     NA        23
#11     6     666 03-01-2017   1234   100 BS        2    NA      1        23
#12     6     666 07-08-2017   1234   120 BS        3     1      1        23
#13     7     777 01-01-2017   1234    90 BS        1    NA      1        23