read.csv.chunked не работает с фильтром% в списке% или is.element в списке в R - PullRequest
0 голосов
/ 06 марта 2019

У меня большой файл (> 6 ГБ) с 5 миллионами + строками и 329 столбцами.

Необходимо получить полные записи для 23 тыс. Строк для фиксированного списка поставщиков медицинских услуг (HCPlist $ NPI). Попытка поднабора или фильтрации по частям во время чтения, так как размер файла перегружает 14 ГБ ОЗУ.

Изначально возникли проблемы из-за типа данных, поэтому я уже преобразовал HCPlist $ NPI в целое число для соответствия типу данных в исходном файле.

Попробовал следующее, и оба работали гладко, но получили 0 строк и 329 столбцов (т.е. без записей)

f <- function(x, pos) filter(x, x[,1] %in% HCPlist$NPI)
NPPESinfo_list <- read_csv_chunked("npidata_pfile_20050523-20190210.csv", 
    DataFrameCallback$new(f), chunk_size = 10000)  

Также пробовал subset вместо filter, а также следующее ... также все прошло гладко, но на выходе было 0 строк и 329 столбцов (т.е. опять нет записей)

# Filter NPPES Data for NPIs
f <- function(x, pos) x[(is.element(x[,1], HCPlist$NPI)),]  
NPPESinfo_list <- read_csv_chunked("npidata_pfile_20050523-20190210.csv", 
    DataFrameCallback$new(f), chunk_size = 10000)

В прошлом я выполнял похожий код, отфильтровывая специальные специальные коды, и он работал нормально. Например ...

# Filter NPPES Data for Specialty (Medical Oncologists = "207RX0202X")
f2 <- function(x, pos) subset(x,
    x[,48] == "207RX0202X" |
    x[,52] == "207RX0202X" )
NPIs_MedOnc <- read_csv_chunked("npidata_pfile_20050523-20190210.csv", 
    DataFrameCallback$new(f2), chunk_size = 10000)

Когда я запускаю тот же фильтр выше только для первых 2000 строк файла, он работает нормально.

# Test run on first 2000 rows
df <- read.csv(file="npidata_pfile_20050523-20190210.csv",nrows=2000)
df2 <- filter(df, df[,1] %in% HCPlist$NPI)

Я получаю хороший фрейм данных с 48 строками и 329 столбцами.

Не уверен, почему filter с %in% отлично работает только на первых 2000 строках и дает мне 48 записей. Однако когда часть функции и применяется к read.csv.chunked, это не дает мне записей?

Здесь можно воспользоваться некоторой помощью, поскольку я не нашел подобного случая / вопроса в других местах в Stackoverflow или Google.

Кажется, что части работают нормально, но когда я собираю то, что хочу, я не получаю нужные записи.

Заранее спасибо !!!

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Спасибо, рикошерк !!!Отличное понимание простого, но эффективного исправления !!!

По какой-то причине read.csv.chunked не понравилось, когда переменная идентифицируется индикатором номера столбца в функции (т. Е. x[, 10]), даже если это то же самоеФункция отлично работала отдельно.Не знаю, почему ...

Самое простое решение сработало лучше всего!

Только что заменили x[, 10] именем столбца / переменной NPI.Даже не было имени фрейма данных, так как оно уже указано как часть функции filter, и это работало как чудо!

Точнее ... заменили это ...

f <- function(x, pos) filter(x, x[,1] %in% HCPlist$NPI)
NPPESinfo_list <- read_csv_chunked("npidata_pfile_20050523-20190210.csv", 
    DataFrameCallback$new(f), chunk_size = 10000) 

... на это ...

f <- function(x, pos) filter(x, NPI %in% HCPlist$NPI)
NPPESinfo_list <- read_csv_chunked("npidata_pfile_20050523-20190210.csv", 
    DataFrameCallback$new(f), chunk_size = 10000) 

Работало отлично !!!

Еще раз спасибо !!!

0 голосов
/ 06 марта 2019

Я не уверен, что это ответ, но я попробовал кое-что с набором данных mtcars.Я стараюсь выбирать автомобили только с 3 передачами.

Это работает:

library(tidyverse)
library(readr)

f1 <- function(x, pos) filter(x, gear %in% c(3))
read_csv_chunked(readr_example("mtcars.csv"), DataFrameCallback$new(f1), chunk_size = 5)

И это также работает, как вы показали:

library(tidyverse)
library(readr)

my_df <- read.csv(readr_example("mtcars.csv"), nrows = 5)
my_df2 <- filter(my_df, my_df[, 10] %in% c(3))

Но этодает мне 0 строк:

library(tidyverse)
library(readr)

f2 <- function(x, pos) filter(x, x[, 10] %in% c(3))
read_csv_chunked(readr_example("mtcars.csv"), DataFrameCallback$new(f2), chunk_size = 5)

Я не знаю, почему (пока) это ведет себя так, но уловка, кажется, использует имя столбца в вашей функции f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...