首页 > 解决方案 > 如何过滤掉每个组的重复行

问题描述

所以这是我正在使用的数据:

ID    Year    State    Grade    Loss    Total    
1     2016    AZ       A        50      1000
1     2016    AZ       A        50      1000
2     2016    AZ       B        0       5000
3     2017    AZ       A        0       2000
4     2017    AZ       C        10      100
2     2017    AZ       B        0       3000

我要做的是创建一个表格,显示按年份、州和年级分组的价值损失量。我已经完成了那部分,但问题是您可以看到 ID=1 存在重复的行。一旦我按年份、州和年级对数据进行分组,我需要在我的代码中添加一个组件,以删除数据中的任何重复行。

在对数据进行分组后,我想删除重复项的原因是 ID 号可能会在不同年份重复,但这没关系,因为这是一个新的观察结果。如果年份、州和年级匹配,我只想删除任何重复项。基本上,如果整行是重复的,则应将其删除。

我不知道我是否应该使用 Unique() 或 Distinct() 但这是我目前所拥有的:

   Answer <- data %>%
        group_by(Year, State, Grade) %>%
        filter(row_number(ID) == 1) %>% #This is the part to replace
        summarise(x = sum(Loss) / sum(Total)) %>%
        spread(State, x)

输出应如下所示:

Year    State    Grade    x
2016    AZ       A        0.05
2016    AZ       B        0
2016    AZ       C        0
2017    AZ       A        0
2017    AZ       B        0
2017    AZ       C        0.1

标签: rdplyr

解决方案


一些东西。下面,我distinct用来删除重复的行。此外,在您的预期结果中,您有一个 2016 年的 C 级条目,这不在您的原始数据中。因此,我曾经complete将此(以及任何其他缺失的情况)添加为零。最后,正如上面@akrun 所说:0.00833从哪里来?错字还是我误解了计算?

df <- read.table(text = "ID    Year    State    Grade    Loss    Total    
1     2016    AZ       A        50      1000
1     2016    AZ       A        50      1000
2     2016    AZ       B        0       5000
3     2017    AZ       A        0       2000
4     2017    AZ       C        10      100
2     2017    AZ       B        0       3000", header = TRUE)

Answer <- df %>%  
  distinct %>% 
  group_by(Year, State, Grade) %>%
  summarise(x = sum(Loss) / sum(Total)) %>%
  complete(Year, State, Grade, fill = list(x = 0)) 

# # A tibble: 6 x 4
# # Groups:   Year, State [2]
#    Year State Grade     x
#   <int> <fct> <fct> <dbl>
# 1  2016 AZ    A      0.05
# 2  2016 AZ    B      0   
# 3  2016 AZ    C      0   
# 4  2017 AZ    A      0   
# 5  2017 AZ    B      0   
# 6  2017 AZ    C      0.1 

推荐阅读