【问题标题】:Replacing expression within data.table替换 data.table 中的表达式
【发布时间】:2020-08-03 17:22:40
【问题描述】:

我正在运行下面的代码来检索一个数据集,不幸的是它使用了“。”而不是 NA 来表示缺失的数据。经过大量的争论和搜索 SO 和其他论坛,我仍然无法让代码替换“。”的所有实例。使用 NA 所以我可以将列转换为数字并继续我的生活。我很确定问题出在屏幕和椅子之间,所以我认为不需要发布 sessionInfo,但请让我知道。帮助解决这个问题将不胜感激。前四列是设置日期和唯一 ID 的整数,所以我只需要更正其他列。提前谢谢大家!

library(data.table)
google_mobility_data <- data.table(read.csv("https://github.com/OpportunityInsights/EconomicTracker/raw/main/data/Google Mobility - State - Daily.csv",stringsAsFactors = FALSE))
# The following line is the one where I can't make it work properly.
google_mobility_data[, .SD := as.numeric(sub("^\\.$", NA, .SD)), .SDcols = -c(1:4)]

【问题讨论】:

  • 你可以使用 fread 来输入你的数据,它接受 na.strings 参数来声明。是 NA
  • 谢谢@MichaelChirico。这将是一个完美的解决方案,但是......我在 curl::curl_download 中遇到错误,HTTP 错误 400。这在我的两台机器上(都是 Windows 10,一台运行 R 3.6.1,另一台运行 4.0.2 .
  • 也许使用readLines 将数据加载为字符向量。然后gsub,., 更改为,NA,,.$ 更改为,NA$。 (对. 进行适当的转义)然后使用fread 读取修改后的字符向量。
  • 如果您收到 fread 的 Http 错误,但不是 read.csv,您能否提交错误报告?
  • 是的,会的。谢谢你的建议。

标签: r regex data.table


【解决方案1】:

我下载了您的数据并将第一行的最后一个条目更改为“。”在最后一列中测试 NA。

使用readLines 读取字符向量。

使用gsub. 更改为NA

使用fread 读取为data.table。

    library(data.table)
    gmd <- readLines("Google Mobility - State - Daily.csv")
    gmd[c(2,3120)]
    
#    [1] "2020,2,24,1,.00286,-.00714,.0557,.06,.0129,.00857,."
#    [2] "2020,4,25,10,-.384,-.191,.,-.479,-.441,.179,-.213"  
    
    gmd <- gsub(",\\.,",",NA,",gmd)
    gmd <- gsub(",\\.$",",NA",gmd)
    gmd[c(2,3120)]
    
#    [1] "2020,2,24,1,.00286,-.00714,.0557,.06,.0129,.00857,NA"
#    [2] "2020,4,25,10,-.384,-.191,NA,-.479,-.441,.179,-.213"  
    
    google_mobility_data <- fread(text=gmd)
    google_mobility_data[c(1,3119)]
    
#   year month day statefips gps_retail_and_recreation gps_grocery_and_pharmacy gps_parks gps_transit_stations gps_workplaces gps_residential gps_away_from_home
#1: 2020     2  24         1                   0.00286                 -0.00714    0.0557                0.060         0.0129         0.00857                 NA
#2: 2020     4  25        10                  -0.38400                 -0.19100        NA               -0.479        -0.4410         0.17900             -0.213
    
    summary(google_mobility_data)

编辑:您提到使用 na.stringsfread 对您不起作用,所以我建议使用上述方法。

但是,至少在像我一样下载数据文件的情况下,这在一行中起作用 - 正如@MichaelChirico 所建议的那样:

google_mobility_data <- fread("Google Mobility - State - Daily.csv",na.strings=".")
google_mobility_data[c(1,3119)]
   year month day statefips gps_retail_and_recreation gps_grocery_and_pharmacy gps_parks gps_transit_stations gps_workplaces gps_residential gps_away_from_home
#1: 2020     2  24         1                   0.00286                 -0.00714    0.0557                0.060         0.0129         0.00857                 NA
#2: 2020     4  25        10                  -0.38400                 -0.19100        NA               -0.479        -0.4410         0.17900             -0.213

【讨论】:

  • 非常感谢。当我下载 csv 文件时,@MichaelChirico 的 fread 方法确实很顺利。但是,我仍然无法直接从网络上下载它,这是我的代码理想的做法(因为这个日期会不断更新,它应该是一个自动更新的笔记本。)然而,即使是离线阅读也是已经是一个了不起的进步!无论如何,感谢 DaveTurek、Michael 和其他查看和思考过它的人。非常感谢!
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2021-06-12
相关资源
最近更新 更多