将带有变量分隔符的字符串转换为数据帧 R



我有一些文本(从网站复制的字符串),想要一种简单的方法将其转换为具有两个不同列的数据帧。实际数据包含的行数比此处详述的要多得多。 主要问题是字符串在应该是第二列中具有可变数量的分隔符(空格)。有没有一种快速简便的方法可以从原始数据转到所需的输出?任何帮助将不胜感激。谢谢。

原始数据(字符串)

my_text = "Column_1  Column_2
01  do something
02  do something else 
03  do the same
04  do something very different"

所需输出(数据帧):

Column_1  Column_2
01        do something
02        do something else 
03        do the same
04        do something very different

将字符串读入L此时它是行向量,修剪末端的空格,将每行的第一个空格序列替换为逗号,然后使用 read.csv。 如果希望Column_1为数字,请省略 colClasses 参数。 (如果文本本身可以有逗号,那么在 sub 中使用与逗号不同的字符,并在 read.csv中使用 sep= 指定它。

L <- readLines(textConnection(my_text))
read.csv(text = sub("\s+", ",", trimws(L)), colClasses = "character")

给:

Column_1                    Column_2
1       01                do something
2       02           do something else
3       03                 do the same
4       04 do something very different

这是一个基本的 R 选项 -

  • 通过删除文本来删除标题(sub('.*?n', '', my_text)),直到第一个'n'
  • 在新行字符上拆分字符串。
  • 使用strcapture捕获两列中的数据。第一列提取数字部分,第二列捕获之后的所有内容。
strcapture('\s+(\d+)\s+(.*)', 
strsplit(sub('.*?n', '', my_text), 'n')[[1]], 
proto = list(Col1 = character(), Col2 = character()))
#  Col1                        Col2
#1   01                do something
#2   02          do something else 
#3   03                 do the same
#4   04 do something very different

这是一个基于stringr的解决方案:

library(stringr)
df <- data.frame(
Column_1 = unlist(str_extract_all(my_text, "\d{2,}")),
Column_2 = unlist(str_extract_all(my_text, "(?:\s)[a-z][a-z\s]+[a-z]"))
)

在这里,\d{2,}确保Column_后的小个位数不匹配;非捕获组(?:\s)断言带有穿插空格的小写文本[a-z][a-z\s]+[a-z]前面有空格(这可以防止匹配Column的小写部分)

结果:

df
Column_1                     Column_2
1       01                 do something
2       02            do something else
3       03                  do the same
4       04  do something very different

最新更新