我是一个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?
中实现这一目标答案 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