【问题标题】:R - Remove all rows but those for most recent date?R - 删除除最近日期以外的所有行?
【发布时间】:2020-04-19 21:59:12
【问题描述】:

我正在开展一个处理 Covid-19 数据的项目。我有每天从 Our World in Data 更新的数据。 csv 文件在这里:https://raw.githubusercontent.com/owid/covid-19-data/9ee33ac73942b2e37eb04014bf2a7a17a83998cf/public/data/owid-covid-data.csv

数据有几列国家、日期、案例等。

我感兴趣的是仅保存每个国家/地区的最新行并删除其他所有内容。解决此问题的最佳方法是什么?

目前,我的代码如下所示。我最近从另一个程序过渡到 R,所以即使这是一个愚蠢的问题,指导也是有帮助的!

world.data < -read.csv("https://raw.githubusercontent.com/owid/covid-19-data/9ee33ac73942b2e37eb04014bf2a7a17a83998cf/public/data/owid-covid-data.csv")
world.data$iso_code < -NULL# Remove Country ISO Code
world.data$date < -as.Date(world.data$date, "%Y-%m-%d")

library(ggplot2)

【问题讨论】:

标签: r dataframe


【解决方案1】:

这是一个使用 tidyverse 的解决方案。我们按位置对数据进行分组并选择日期的最大值。

rawData <- "https://raw.githubusercontent.com/owid/covid-19-data/9ee33ac73942b2e37eb04014bf2a7a17a83998cf/public/data/owid-covid-data.csv"
download.file(rawData,"./data/owid_covid_data.csv")

data <- read.csv("./data/owid_covid_data.csv",header = TRUE, stringsAsFactors = FALSE)

library(dplyr)
data %>% group_by(location) %>% 
     filter(date == max(date)) -> filteredData

...以及输出的前几行:

> head(filteredData[1:4])
# A tibble: 6 x 4
# Groups:   location [6]
  iso_code location    date       total_cases
  <chr>    <chr>       <chr>            <int>
1 ABW      Aruba       2020-04-19          96
2 AFG      Afghanistan 2020-04-19         908
3 AGO      Angola      2020-04-19          24
4 AIA      Anguilla    2020-04-19           3
5 ALB      Albania     2020-04-19         548
6 AND      Andorra     2020-04-19         704
> 

【讨论】:

  • 很好的答案;澄清一下,filter(date == max(date)) 是否按每行的最大日期过滤?还是它会选择该列的最大日期并填写任何尚未由 NA 更新的条目?
  • @jpmam1 - 因为在管道中group_by(location)filter() 之前,filter() 处理每个不同的location,返回date 等于date 最大值的行那个位置。因此,如果 Aruba 的最近日期是 2020 年 4 月 19 日,而安哥拉的最近日期是 2020 年 4 月 18 日,则返回给安哥拉的行将是 4 月 18 日的行。 dplyr 包非常强大,但是因为包含数百个函数而很难学习。实际上,另一个答案中的top_n(1,date) 只是指定filter(date == max(date)) 的另一种方式。
【解决方案2】:

尝试类似:

library(tidyverse)
world.data %>% group_by(location) %>% top_n(1,date)

或者没有管道

top_n(group_by(world.data, location), 1, date)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2017-10-11
    • 2021-01-25
    • 2022-11-23
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多