gpt4 book ai didi

r - 如何在 data.table 中使用 cmd 删除坏行?

转载 作者:行者123 更新时间:2023-12-02 08:01:03 25 4
gpt4 key购买 nike

我有一个 csv.gz 文件,其内容如下:

bogusfile <- '1,2,3
1,2,3
2,,3
1,2,3,4
1,2,3
1,2,3
1,2,3'

知道只有 3 列,但有时会弹出一个额外的伪造的第 4 列,并用 fread 搞乱我的解析。

幸好fread中有一个cmd命令。我们如何使用它来丢弃所有包含恰好超过 2 个逗号的行(这些行将是带有额外 coumns 的违规行)。

类似fread(cmd = 'linux magic to clean myfile.csv.gz')

我无法让它发挥作用。你怎么认为?谢谢!

最佳答案

data.table::fread(cmd = 'c:/Rtools/bin/grep.exe -E -v "[^,]*,[^,]*,[^,]*," Noobie.txt')
# V1 V2 V3
# 1: 1 2 3
# 2: 1 2 3
# 3: 2 NA 3
# 4: 1 2 3
# 5: 1 2 3
# 6: 1 2 3

我必须使用 grep -E 代替 egrep 因为 windows ... 我必须指定 grep 的完整路径因为RTools 不在我的默认路径中。如果您使用的不是 Windows,您应该能够将其缩短为 fread(cmd="egrep -v ...")。 (并确保您在正确的目录中或提供文件的相对/绝对路径。)

正则表达式 "[^,]*,[^,]*,[^,]*," 有点字面意思,可以简写为 "([^, ]*,){3,}",表示

  • ([^,]*,) 一组非逗号后跟一个逗号
  • {3,}三个或更多
  • -v 省略与模式匹配的行

所以

data.table::fread(cmd = 'c:/Rtools/bin/grep.exe -E -v "([^,]*,){3,}" Noobie.txt')

如果数据是压缩的 (gz),在非 Windows 平台上您可以选择:

gzip -cd filename.csv.gz | egrep -v "([^,]*,){3,}"
gunzip -c filename.csv.gz | egrep -v "([^,]*,){3,}"
zgrep -E -V "([^,]*,){3,}" filename.csv.gz

它不会在 Windows 上运行,因为 system 和 Windows 上 R 上的类似功能不使用 bash 作为它的 shell,所以 | in-fix 运算符不符合预期。可能有一种方法可以让 |system 等中工作,但我不知道如何让它与 data.table::一起工作: fread(..., cmd=).

诚然未经测试,因为...我在 Windows 上:-(

关于r - 如何在 data.table 中使用 cmd 删除坏行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57277555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com