使用 R 将大型文本文件构建为数据框
Structuring a large text file into a dataframe using R
我有一个大约 20 页的文本文件,其中包含大约 200 个段落。每段包含三行描述这样一个人的信息:
Name: John
Age: 26
Phone number: 123421
Name: Mary
Age: 80
Phone number: NA
...
现在我想将这个大文件转换成一个数据框,其中列代表三个变量名称、年龄和 Phone 数字,行对应于人。
Name Age Phone number
John 26 123421
Mary 80 NA
... ... ...
如何将大文本文件转换成这样的数据框?
不漂亮,但这里有一个正则表达式选项,它可能会起作用,具体取决于数据的读入方式,
test<-
"Name: John
Age: 26
Phone number: 123421
Name: Mary
Age: 80
Phone number: NA
"
读作:
[1] "Name: John\nAge: 26\nPhone number: 123421\n\nName: Mary\nAge: 80\nPhone number: NA\n"
现在使用正则表达式获取所有匹配项,始终捕获 NA 以确保行数相同:
Names<-regmatches(test, gregexpr("(?<=Name: )[a-zA-Z]+", test, perl=TRUE))
Numbers<-regmatches(test, gregexpr("(?<=Phone number: )[a-zA-Z0-9]+", test, perl=TRUE))
Age<-regmatches(test, gregexpr("(?<=Age: )[a-zA-Z0-9]+", test, perl=TRUE))
df<-data.frame(Names,Numbers,Age)
names(df)<-c("Name","Number","Age")
> df
Name Number Age
1 John 123421 26
2 Mary NA 80
如果使用 read.csv
读取数据,下面是如何为这种方法格式化数据
test<-read.csv(text=test, header=F, stringsAsFactors=FALSE)
test<-list(test$V1)
test<-paste(unlist(test), collapse =" ")
>test
[1] "Name: John Age: 26 Phone number: 123421 Name: Mary Age: 80 Phone number: NA"
如果您有姓氏,我们的 Names
参数的正则表达式也需要更改:
(?<=Name: ).+?(?=Age)
基础 R 中的 read.dcf()
是为读取此类数据而构建的:
read.dcf(textConnection(test), all = TRUE)
Name Age Phone number
1 John 26 123421
2 Mary 80 NA
DCF(“Debian 控制文件”)格式的简要说明可在 help("read.dcf")
找到。
数据
test <-
"Name: John
Age: 26
Phone number: 123421
Name: Mary
Age: 80
Phone number: NA
"
我有一个大约 20 页的文本文件,其中包含大约 200 个段落。每段包含三行描述这样一个人的信息:
Name: John
Age: 26
Phone number: 123421
Name: Mary
Age: 80
Phone number: NA
...
现在我想将这个大文件转换成一个数据框,其中列代表三个变量名称、年龄和 Phone 数字,行对应于人。
Name Age Phone number
John 26 123421
Mary 80 NA
... ... ...
如何将大文本文件转换成这样的数据框?
不漂亮,但这里有一个正则表达式选项,它可能会起作用,具体取决于数据的读入方式,
test<-
"Name: John
Age: 26
Phone number: 123421
Name: Mary
Age: 80
Phone number: NA
"
读作:
[1] "Name: John\nAge: 26\nPhone number: 123421\n\nName: Mary\nAge: 80\nPhone number: NA\n"
现在使用正则表达式获取所有匹配项,始终捕获 NA 以确保行数相同:
Names<-regmatches(test, gregexpr("(?<=Name: )[a-zA-Z]+", test, perl=TRUE))
Numbers<-regmatches(test, gregexpr("(?<=Phone number: )[a-zA-Z0-9]+", test, perl=TRUE))
Age<-regmatches(test, gregexpr("(?<=Age: )[a-zA-Z0-9]+", test, perl=TRUE))
df<-data.frame(Names,Numbers,Age)
names(df)<-c("Name","Number","Age")
> df
Name Number Age
1 John 123421 26
2 Mary NA 80
如果使用 read.csv
test<-read.csv(text=test, header=F, stringsAsFactors=FALSE)
test<-list(test$V1)
test<-paste(unlist(test), collapse =" ")
>test
[1] "Name: John Age: 26 Phone number: 123421 Name: Mary Age: 80 Phone number: NA"
如果您有姓氏,我们的 Names
参数的正则表达式也需要更改:
(?<=Name: ).+?(?=Age)
基础 R 中的 read.dcf()
是为读取此类数据而构建的:
read.dcf(textConnection(test), all = TRUE)
Name Age Phone number 1 John 26 123421 2 Mary 80 NA
DCF(“Debian 控制文件”)格式的简要说明可在 help("read.dcf")
找到。
数据
test <-
"Name: John
Age: 26
Phone number: 123421
Name: Mary
Age: 80
Phone number: NA
"