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