【问题标题】:Delimiters in the wrong places错误位置的分隔符
【发布时间】:2018-02-10 02:18:46
【问题描述】:

我正在将 TSV 文件导入 R,但某些选项卡位于错误的位置。例如,我想要:

Name        Appointment
John Doe    12:30
Jane Doe    1:00
Rick Smith  11:45
Susy Smith  10:15

但是我得到了

Name        Appointment
John Doe    12:30
Jane        Doe 1:00
Rick Smith  11:45
Susy        Smith  10:15

没有真正的模式,因为它是用户错误。我开发了一种解决方法,使用 substr() 来提取约会时间,但后来我失去了姓氏。

我也试过

separate(Data, col = Appointment, c("last", "time"), " ")

并从那里开始工作,但这也不起作用,因为姓氏和时间之间的空格数是可变的,并且格式不一致:

Name        Last    Time
John Doe    12:30
Jane        Doe     1:00
Rick Smith  11:45
Susy        Smith   

对不起,如果这是一个愚蠢的问题!

【问题讨论】:

  • 你绝对应该改变你的导出,这样你要么有一个适当的分隔符分隔逻辑字段,要么在可能有空格的单个术语周围加上引号。从我的角度来看,这不是 R 问题,您的源数据是罪魁祸首。

标签: r csv data-cleaning


【解决方案1】:

我们可以用readLines阅读这个,改变分隔符然后用read.csv

df1 <- read.csv(text=sub("([a-z])\\s+([0-9])", "\\1, \\2", lines[-1]),
 header = FALSE, col.names = strsplit(lines[1], "\\s+")[[1]], stringsAsFactors = FALSE)

要删除“名称”中的多余空格,请使用 gsub

df1$Name <- gsub("\\s+", " ", df1$Name)

给我们输出

df1
#        Name Appointment
#1   John Doe       12:30
#2   Jane Doe        1:00
#3 Rick Smith       11:45
#4 Susy Smith       10:15

数据

lines <- readLines("file.txt")

【讨论】:

  • 我对正则表达式不太感兴趣,所以只是为了确保我理解,sub("([az])\\s+([0-9])", "\\ 1, \\2", lines[-1]) 是说“找到一个字符串和一个或多个空格后跟数字的观察,然后用相同的字符串替换它们,后跟逗号,后跟数字。”抱歉,这有点超出我的想象,但也非常有帮助
  • @Oct 没错。通过使用(..),我们将其捕获为一个组,然后使用反向引用(\\1)在替换中获取捕获的组
  • 我似乎无法将替换参数应用于我的数据。例如,我在名称列中有 J,R,所以我尝试了 read.csv(text=sub(pattern = "[AZ][:punct:][AZ]", "\\1\\3", lines[- 1]) 和 read.csv(text=sub(pattern = "[AZ],[AZ]", "\\1\\3", lines[-1]) 前者不做任何替换,后者只是从数据中删除模式而不用任何东西替换它。
  • @Oct 我的模式基于您提供的示例
  • 没关系,我是个白痴。只是去掉了一些括号,所以这就是反向引用不起作用的原因。非常感谢您的帮助,您是救生员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多