data.table::fread-在MSWindows环境中读取时过滤数据

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

请帮助我在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/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')