Замена выражения в data.table - PullRequest
0 голосов
/ 03 августа 2020

Я запускаю следующий код, чтобы получить набор данных, который, к сожалению, использует "." вместо NA для представления отсутствующих данных. После долгих споров и поисков в SO и других форумах я все еще не могу заставить код заменить все экземпляры "." с NA, чтобы я мог преобразовать столбцы в числа c и go на всю жизнь. Я почти уверен, что проблема между экраном и стулом, поэтому я не вижу необходимости публиковать информацию о сеансе, но, пожалуйста, сообщите мне об обратном. Мы будем благодарны за помощь в решении этого вопроса. Первые четыре столбца представляют собой целые числа, указывающие дату и уникальный идентификатор, поэтому мне нужно будет исправить только другие столбцы. Заранее всем спасибо!

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)]

1 Ответ

1 голос
/ 04 августа 2020

Я загрузил ваши данные и изменил последнюю запись в первой строке на "." для проверки NA в последнем столбце.

Используйте readLines для чтения вектора символов.

Используйте gsub, чтобы изменить . на NA.

Используйте fread для чтения как таблицы данных.

    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)

EDIT: вы упомянули, что использование na.strings с fread не сработало для вас, поэтому я предложил вышеуказанный подход.

Однако, по крайней мере, с загруженным файлом данных, как это сделал я, это работало в одной строке - как было предложено @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
...