【问题标题】:Importing first three and last three fields from CSV with variable number of fields从 CSV 导入前三个和后三个字段,字段数量可变
【发布时间】:2016-10-27 10:32:32
【问题描述】:

我在 csv 中有一个数据集。不幸的是,每一行都有不同数量的“,”逗号。我有兴趣从 R 中的文件中只导入前 3 个和后 3 个变量。

例如:

> line: "A","B","C","D",...,"X",Y","Z"

我想实现如下`

> line: "A","B","C","X","Y","Z"

我尝试使用 grep 来查找 - 通过使用正则表达式 - 前 3 个变量:

new_data <- grep("([^,]+)(,[^,]+){2}", dataset, values=TRUE)

在该操作之后,它会显示该表达式存在的所有行。

如何使用 grep 删除行中的以下变量,如果可能,如何删除整个区间( 中的每个变量)。

你现在有其他方法来解决这个问题吗?

【问题讨论】:

  • “不幸的是,每一行都有不同数量的逗号/字段”。这可以称为“参差不齐”的文件或“可变数量的字段”。
  • 您想要 R 中的解决方案,还是像 @VarunM 提供的命令行解决方案?
  • Inside R 解决方案会很酷,我现在正在尝试实现 Varun 提供的“awk”解决方案。
  • 抱歉,我看到了 grep 并认为命令行解决方案可以。我什至不关注 StackOverflow 上的 r。希望我的回答对你有所帮助!
  • 感谢您的解决方案;)我尝试在 R 中实现它,但收到以下错误:“系统错误(awk_call,实习生 = 实习生):'awk' 未找到”暂时我不知道为什么,但是当我弄清楚时,我会分享这些知识

标签: r regex read.csv ragged


【解决方案1】:

使用applyheadtail 的组合:

d2 <- data.frame(t(apply(d1, 1, function(x) c(head(x[x != ''],3), tail(x[x != ''],3)))))

导致:

> d2
  X1 X2 X3 X4 X5 X6
1  a  b  c  x  y  z
2  a  b  c  g  h  i
3  a  b  c  t  u  v

使用@VarunM的数据:

d1 <- read.csv(text='a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
a, b, c, d, e, f, g, h, i
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v', header = FALSE, fill = TRUE)

【讨论】:

  • @VarunM 使用您的数据方便 ;-)
【解决方案2】:

试试 awk-

awk -F, '{print $1, $2, $3, $(NF-2), $(NF-1), $(NF)}' file

-F, 将字段分隔符更改为逗号。

NF 是数据集中的最后一个字段。 NF-1NF-2 很明显。

我做了一个示例文件-

$cat file.csv
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 
a, b, c, d, e, f, g, h, i
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v

在做-

$awk -F, '{print $1, $2, $3, $(NF-2), $(NF-1), $(NF)}' file.csv

输出-

a  b  c  x  y  z 
a  b  c  g  h  i
a  b  c  t  u  v

编辑

如果您执行以下操作,此解决方案将非常有效-

> system('awk -F, \'{print $1, $2, $3, $(NF-2), $(NF-1), $(NF)}\' file.csv')

其中 file.csv 是包含数据的文件。

【讨论】:

    【解决方案3】:

    命令行解决方案会更简单,但如果您想在 R 中使用 R 代码中的解决方案,则通过 textConnection 过滤传入的 CSV 并使用字符串操作或正则表达式来提取第一个和最后三个字段:

    csvConn <- textConnection('your.csv')
    <use string operations or regex to extract the first and last three fields>
    read.csv(data = csvFixed, ...)
    

    这行得通,我以前做过。 请参阅涉及textConnection and read.csv(data=...) 的其他类似解决方案。不过我找不到一个非常干净的例子。

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 2022-10-23
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      相关资源
      最近更新 更多