【问题标题】:Clean character vector and strsplit into dataframe清理字符向量并 strsplit 成数据框
【发布时间】:2016-04-13 14:42:51
【问题描述】:

我有一个要转换为数据框的字符验证器。 它大部分都很干净,但我不知道如何完成清洁。请注意,实际数据是Date 列作为yyyy-mm-ddVariable 列作为数字(在本例中为四位但不总是),用逗号分隔。

class(myvec)
[1] "character"
myvec
[1] " \"2016-01-01,8631n\" " " \"2016-01-02,8577n\" "
[3] " \"2016-01-03,8476n\" " " \"2016-01-04,8365n\" "
[5] " \"2016-01-05,8331n\" " " \"2016-01-06,8801n\" "
[7] " \"2016-01-07,5020n\"" 

应该删除空格和反斜杠“('\”')。与 n\" 相同 预期的输出应该是这样的数据框

    Date         Variable  
[1,] "2016-01-01" "8631"
[2,] "2016-01-02" "8577"
[3,] "2016-01-03" "8476"
[4,] "2016-01-04" "8365"
[5,] "2016-01-05" "8331"
[6,] "2016-01-06" "8801"
[7,] "2016-01-07" "5020"

一旦向量是氏族,我认为这样就可以了

do.call(rbind,strsplit(clean_vector,","))

我想我可以自己将lubridatevar 转换为数字,用 as.numeric 转换为数字,问题是要让字符向量干净且格式正确。

【问题讨论】:

  • gsub("[n \"]","",x) # "2016-01-01,8631" 适用于第一个。您也可以只使用substr,因为您的所有对象似乎都是固定宽度的。
  • @Frank 请发布答案,这太棒了!也可以提供一些解释

标签: regex r


【解决方案1】:

您可以通过枚举它们来删除违规字符:

# example
x = " \"2016-01-01,8631n\" "

gsub("[n \"]","",x)
# "2016-01-01,8631"

这是因为[xyz] 可以识别列表xyz 中的任何单个字符。


或者你可以取一个子字符串,因为格式是固定宽度的,开头和结尾的字符不好:

substr(x,3,17)
# "2016-01-01,8631"

如果字符串的 var 部分长度不同,nchar(x)-3 应该代替 17

【讨论】:

  • 第二个是我原来的方法,但我注意到“项目具有固定宽度”是不正确的,我无法预测数字何时会有更多数字
  • @MatiasAndina 你可以使用nchar(x)-3 或者如果最后总是有三个坏字符。
  • 好久没见了。加一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多