首页 > 解决方案 > 在任何包含空格的单词周围放置一个 ' '

问题描述

我有一些文本数据 ( dat),其中一个变量State可以由一些单词和一些空格组成,例如New York.

为了正确读取数据,我需要将所有有空格的字符串元素dat放在单引号中,如下所示:New York--> 'New York'

我想知道这是否有可能实现?

dat <-
"State Expend PTratio Salary PctSAT SAT PctACT ACT
Montana 5.692 16.3 28.785 21 1009 55 21.9
New York 9.774 13.8 46.087 70 898 3 20.8
"
# EXAMPLE OF USE:
read.table(text = dat, header = T) # Error! But if we use 'New York' works fine!

标签: rregexstringfunctiondataframe

解决方案


如果它基于“状态”列的模式,那么我们可以''为不包含数字 ( \\D+)的单词(\\d+)插入第二组),在 中replacement,指定捕获组的反向引用(\\1, \\2),并在第一个捕获组周围插入引号

read.table(text = gsub("\n(\\D+\\s*\\D+) (\\d+)",
           "\n'\\1' \\2", dat), header = TRUE)
#    State Expend PTratio Salary PctSAT  SAT PctACT  ACT
#1  Montana  5.692    16.3 28.785     21 1009     55 21.9
#2 New York  9.774    13.8 46.087     70  898      3 20.8

如果该列位于不同的位置,则提到了 OP。在这里,我们正在使用模式,即如果列位于第 n 个位置并且直接邻居是数字,则使用它来创建模式

dat1 <- "Expend PTratio Salary PctSAT SAT State PctACT ACT\n5.692 16.3 28.785 21 1009 Montana 55 21.9\n 9.774 13.8 46.087 70 898 New York 3 20.8\n"
read.table(text = gsub("(\\d+)\\s+([A-Za-z ]+) (\\d+)",
         "\\1 '\\2' \\3", dat1), header = TRUE)
# Expend PTratio Salary PctSAT  SAT    State PctACT  ACT
#1  5.692    16.3 28.785     21 1009  Montana     55 21.9
#2  9.774    13.8 46.087     70  898 New York      3 20.8

推荐阅读