data.table::fread-在MSWindows环境中读取时过滤数据
请帮助我在MSWindows中读取包含data.table::fread的非常大的csv时过滤数据的正确语法 例如,我只想保留sex==“T”列中的行,将日期保持在2020-01-31到2020-07-01的范围内 我遇到过这样的语法,但据说它只在Linux中工作。是否有Windows命令行等效程序?:data.table::fread-在MSWindows环境中读取时过滤数据,r,windows,awk,data.table,R,Windows,Awk,Data.table,请帮助我在MSWindows中读取包含data.table::fread的非常大的csv时过滤数据的正确语法 例如,我只想保留sex==“T”列中的行,将日期保持在2020-01-31到2020-07-01的范围内 我遇到过这样的语法,但据说它只在Linux中工作。是否有Windows命令行等效程序?: mdata2 <- data.table::fread( cmd = "awk '$2 == \"T\" {print {$1}' data/de
mdata2 <-
data.table::fread(
cmd = "awk '$2 == \"T\" {print {$1}' data/demo2021-01-31_14_30_17.csv",
nThread = 8
)
EDIT2:在我从@r2evans收到supperb的答复后,我尝试了以下语法,它可以工作:
mdata2 <-
data.table::fread(cmd='awk "{ if (NR == 1 || ($2 == "T" && $10 == "TOTAL")) print }" data/demo2021-01-30_23_59_00.csv')
mdata2如果您在windows上运行,则应安装Rtools或Rtools40。如果是这样,那么您就有了可用的awk
。(如果不需要,那么就安装它:。这对于awk
来说是一项繁重的工作,当然,但是如果您还不需要它来安装某些软件包,那么您很有可能在某个时候需要它。)
您可以验证它是否可用于
Sys.which(“awk”)
#awk
#“c:\\Rtools40\\usr\\bin\\awk.exe”
如果您得到的是”
,那么您需要找到它。查找安装了Rtools的基本目录(对于我来说,它是C:/Rtools40/
),然后手动设置路径:
#为awk测试设置常规文件:
write.table(mtcars,file=“mt.tab”,sep=“\t”,row.names=FALSE)
###awk的完整路径
fread(cmd=“c:/Rtools40/usr/bin/awk'{print$1}'mt.tab”)[1:3,]
#mpg
#
# 1: 21.0
# 2: 21.0
# 3: 22.8
(我不是建议您使用此awk代码,它只是一个空格填充符,表明我正在使用awk
以某种方式处理一个包含11列的文件。)
为了更好地进行过滤,类似这样的方法很有效:
data.table::fread(cmd='awk'{if(NR==1 | | |($2==4&&$10==4))打印}“mt.tab')
#mpg气缸显示hp drat wt qsec与am齿轮carb
#
# 1: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
# 2: 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
# 3: 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
# 4: 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# 5: 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
# 6: 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
# 7: 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
# 8: 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
NR==1
用于确保获得标题行;如果没有标题行,可以删除条件语句的该部分
- 在这里,我正在筛选4个气缸中的
气缸($2
)和4个齿轮中的齿轮($10
)
为清楚起见,双引号对于fread
如何围绕cmd
调用system
非常重要:当我在反转双引号/单引号的情况下运行时,它失败:
data.table::fread(cmd=“awk”{if(NR==1 | |($2==4&$10==4))打印}'mt.tab”)
#此时打印是意外的。
#(如果(.Platform$OS.type==“unix”)系统else shell中出现警告(粘贴0(“(”,):
#“(awk'{if(NR==1 | |($2==4&&$10==4))print}”mt.tab)>C:\Users\r2\AppData\Local\Temp\RtmpMVUOli\filed3067f77a57”执行失败,错误代码为1
#数据表中出错::fread(cmd=“awk'{if(NR==1 | |($2==4&$10==4))print}'mt.tab”):
#文件“C:\Users\r2\AppData\Local\Temp\RtmpMVUOli\filed3067f77a57”不存在或不可读。getwd()=='C:/Users/r2/Downloads'
R的system
(因此system2
和shell
)很可怕,所以cmd=
对引号和空格很敏感并不让我感到惊讶。如果你在windows上运行,你应该安装Rtools或Rtools40。如果是这样,那么你就有了awk
。(如果不需要,那么就安装它:。这对于awk
来说是一项繁重的工作,当然,但是如果您还不需要它来安装某些软件包,那么您很有可能在某个时候需要它。)
您可以验证它是否可用于
Sys.which(“awk”)
#awk
#“c:\\Rtools40\\usr\\bin\\awk.exe”
如果您得到的是”
,那么您需要找到它。查找安装了Rtools的基本目录(对于我来说,它是C:/Rtools40/
),然后手动设置路径:
#为awk测试设置常规文件:
write.table(mtcars,file=“mt.tab”,sep=“\t”,row.names=FALSE)
###awk的完整路径
fread(cmd=“c:/Rtools40/usr/bin/awk'{print$1}'mt.tab”)[1:3,]
#mpg
#
# 1: 21.0
# 2: 21.0
# 3: 22.8
(我不是建议您使用此awk代码,它只是一个空格填充符,表明我正在使用awk
以某种方式处理一个包含11列的文件。)
为了更好地进行过滤,类似这样的方法很有效:
data.table::fread(cmd='awk'{if(NR==1 | | |($2==4&&$10==4))打印}“mt.tab')
#mpg气缸显示hp drat wt qsec与am齿轮carb
#
# 1: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
# 2: 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
# 3: 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
# 4: 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# 5: 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
# 6: 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
# 7: 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
# 8: 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
NR==1
用于确保我们获得标题行;如果没有标题行,可以删除条件语句的该部分
- 我在这里过滤4档和档位的
cyl
($2
)
mdata2 <-
data.table::fread(
cmd = paste('awk -F, \'$2 == "T" && $3 == "TOTAL" \'', "data/demo2021-01-30_23_59_00.csv")
)
'(awk , '$2 == "T" && $3 == "TOTAL" ' data/demo2021-01-30_23_59_00.csv) > C:\Users\jkotows2\AppData\Local\Temp\18\Rtmp4iwcUc\file379051a52dfd' execution failed with error code 1File 'C:\Users\jkotows2\AppData\Local\Temp\18\Rtmp4iwcUc\file379051a52dfd' has size 0. Returning a NULL data.table.
mdata2 <-
data.table::fread(cmd='awk "{ if (NR == 1 || ($2 == "T" && $10 == "TOTAL")) print }" data/demo2021-01-30_23_59_00.csv')