如何过滤出每组重复的行

时间:2018-12-05 17:50:52

标签: r dplyr

这是我正在使用的数据:

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

1 个答案:

答案 0 :(得分:2)

几件事。在下面,我使用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