这是我正在使用的数据:
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
答案 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