我經常使用read.csv函式來讀取大型 CSV 檔案。這些檔案沒有標題,因此通過使用col.names引數,我正確定義了匯入后將創建的資料框中的變數名稱。
今天,我第一次不得不使用sqldf包中的read.csv.sql。要匯入的檔案非常大,我只需要基于該檔案中的條件的某些行。根據在線檔案,過濾器必須在陳述句的WHERE子句中定義SELECT。假設我的檔案中有一個列(在其他列中),user_account我只想匯入user_account = 'Foo'滿足條件的行。因此,我必須寫類似
df <- read.csv.sql(
"my_big_data_file.csv",
sql = "select * from file where user_account = 'Foo'",
header = FALSE,
colClasses = c(... Here I define column types ...),
sep = "|",
eol = "\n"
)
現在的問題是,不像read.csv顯然col.names在read.csv.sql. 鑒于我的檔案沒有標題,我不知道如何參考列名。正如我在上述代碼中的 sql 引數子句中所寫user_account的那樣,我收到一條錯誤訊息。WHERER抱怨沒有這樣的變數。
那么,如何在沒有標題的CSV 檔案中參考列read.csv.sql名,同時在過濾器中參考這些列名?這甚至可能嗎?
提前致謝
uj5u.com熱心網友回復:
最后我在檔案中找到了答案read.csv.sql。而不是colClasses必須通過直接指定資料型別來使用fields.types,因為它們是在 SQLite 而不是在 R 中定義的。
field.types:一個串列,其名稱是列名,其內容是列的 SQLite 型別(不是 R 類名)。指定這些型別可以提高它的速度。除非速度非常重要,否則通常不使用此引數。
SQLite 資料型別可在此處獲得
因此我相應地修改了我的程式:
df_tmp <- read.csv.sql(
file = input_file_path,
sql = "
select
*
from
file
where trim(lower(user_account)) = 'foo'",
header = FALSE,
sep = "|",
eol = "\n",
`field.types` = list(
col1 = c("TEXT"),
col2 = c("TEXT"),
user_account = c("TEXT"),
col4 = c("REAL"),
col5 = c("REAL")
),
dbname = tempfile(),
drv = "SQLite"
)
但是,最后我必須通過as.numeric一個已轉換為字符的變數進行顯式轉換。但該程式通過明確的警告資訊表明了這一點。所以最后,這個解決方案為我完成了作業。
我希望這可以幫助那些遇到同樣問題的人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/523238.html
上一篇:Python資料將行格式化為列
