如何从 R 中的 csv 数据中删除 [1]、[[1]] 和双引号?
How to remove the [1]s, [[1]]s and double quotes from a csv data in R?
我有一个 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"
(我不知道为什么在行号和输出数据之间浪费了 space)
我需要上面的数据显示如下(没有[1]或[[1]]或“”,数据放在其对应的数字旁边,如):
789 PNG,D115,DX06,Slz
787 D010,HC
949 HC,DX06
(可能 789
及其对应的数据 PNG,D115,DX06,Slz
应该用制表符分隔.. 每一行都这样)
如何在 R 中实现这一点?
我们可以创建一个分组变量 ('indx'),split
'V1' 列在删除开头的括号部分以及引号后使用分组索引字符串 "
。假设我们需要第一列作为数字元素,第二列作为非数字部分,我们可以使用正则表达式将 space 替换为 ,
(如预期结果所示,并且然后 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
数据
df1 <- structure(list(V1 = c("[1] 789", "[[1]]",
"[1] \"PNG\" \"D115\" \"DX06\" \"Slz\"",
"[1] 787", "[[1]]", "[1] \"D010\" \"HC\"", "[1] 949",
"[[1]]", "[1] \"HC\" \"DX06\"")), .Names = "V1",
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6",
"7", "8", "9"))
老实说,使用 sed/perl/egrep -o 的命令行修复更轻松:
sed -e 's/.*\][ \t]*//' dirty.csv > clean.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"
(我不知道为什么在行号和输出数据之间浪费了 space)
我需要上面的数据显示如下(没有[1]或[[1]]或“”,数据放在其对应的数字旁边,如):
789 PNG,D115,DX06,Slz
787 D010,HC
949 HC,DX06
(可能 789
及其对应的数据 PNG,D115,DX06,Slz
应该用制表符分隔.. 每一行都这样)
如何在 R 中实现这一点?
我们可以创建一个分组变量 ('indx'),split
'V1' 列在删除开头的括号部分以及引号后使用分组索引字符串 "
。假设我们需要第一列作为数字元素,第二列作为非数字部分,我们可以使用正则表达式将 space 替换为 ,
(如预期结果所示,并且然后 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
数据
df1 <- structure(list(V1 = c("[1] 789", "[[1]]",
"[1] \"PNG\" \"D115\" \"DX06\" \"Slz\"",
"[1] 787", "[[1]]", "[1] \"D010\" \"HC\"", "[1] 949",
"[[1]]", "[1] \"HC\" \"DX06\"")), .Names = "V1",
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6",
"7", "8", "9"))
老实说,使用 sed/perl/egrep -o 的命令行修复更轻松:
sed -e 's/.*\][ \t]*//' dirty.csv > clean.csv