使用可变数量的字段从CSV导入前三个和后三个字段

时间:2016-10-27 10:32:33

标签: r regex grep read.csv ragged

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

例如

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

我想实现以下`

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

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

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

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

如何使用grep删除行中的以下变量,如果可能,我如何删除整个时间间隔(每个变量来自&lt; 3; n-3&gt;)。

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

3 个答案:

答案 0 :(得分:4)

结合使用applyhead以及tail

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)

答案 1 :(得分: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是包含数据的文件。

答案 2 :(得分:1)

命令行解决方案会更容易,但是如果你想在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=...)的其他类似解决方案。我找不到一个非常干净的例子。