如何从R中的csv数据中删除[1] s,[[1]]和双引号?

时间:2015-05-08 07:08:34

标签: regex r csv format read.csv

我是一个CSV文件。它包含一些先前R操作的输出,因此它用索引号填充(例如[1],[[1]])。当它被读入R时,它看起来像这样,例如:

        V1
1                                                                                                           [1] 789
2                                                                                                             [[1]]
3                                                           [1] "PNG"        "D115"    "DX06"    "Slz"
4                                                                                                           [1] 787
5                                                                                                             [[1]]
6                                                                       [1] "D010"           "HC"
7                                                                                                           [1] 949
8                                                                                                             [[1]]
9                                                                       [1] "HC" "DX06"          

(我不知道为什么在行号和输出数据之间浪费了所有空间)

我需要上面的数据显示如下(没有[1]或[[1]]或""并且数据放在相应的数字旁边,如:)

789 PNG,D115,DX06,Slz
787 D010,HC
949 HC,DX06

(可能789及其对应的数据PNG,D115,DX06,Slz应该用标签分隔..并且每行都有相似的内容)

如何在R?

中实现这一目标

2 个答案:

答案 0 :(得分:3)

我们可以在删除开头的括号部分以及字符串split中的引号后使用分组索引创建分组变量('indx'),"'V1'列。假设我们需要第一列作为数字元素,第二列作为非数字部分,我们可以使用正则表达式将空格替换为,(如预期结果中所示,然后{{1列表元素。

rbind

数据

indx <- cumsum(c(grepl('\\[\\[', df1$V1)[-1], FALSE))
 do.call(rbind,lapply(split(gsub('"|^.*\\]', '', df1$V1), indx),
         function(x) data.frame(ind=x[1],
    val=gsub('\\s+', ',', gsub('^\\s+|\\s+$', '',x[-1][x[-1]!=''])))))

 #   ind               val
 #1  789 PNG,D115,DX06,Slz
 #2  787           D010,HC
 #3  949           HC,DX06

答案 1 :(得分:1)

老实说,使用sed / perl / egrep -o的命令行修复不那么痛苦了:

sed -e 's/.*\][ \t]*//' dirty.csv > clean.csv