【问题标题】:How to remove the [1]s, [[1]]s and double quotes from a csv data in R?如何从 R 中的 csv 数据中删除 [1]s、[[1]]s 和双引号?
【发布时间】:2015-05-08 07:08:33
【问题描述】:

我有一个 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 中实现这一点?

【问题讨论】:

  • 这是个好问题。
  • 修复创建此文件的数据导出会更好(也更容易)。

标签: regex r csv format read.csv


【解决方案1】:

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

【讨论】:

  • 那是一段很棒的代码(虽然对于像我这样的初学者来说非常复杂,完全理解)将进一步研究它。非常感谢你:)
【解决方案2】:

老实说,使用 sed/perl/egrep -o 进行命令行修复会更轻松:

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

【讨论】:

  • 感谢您指出另一种选择。我是 R 的初学者。也会检查一下并学习。非常感谢。
猜你喜欢
  • 2022-06-14
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2017-02-13
  • 2022-01-20
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
相关资源
最近更新 更多