R 如何将.txt文件中的字符串列表转换为数据帧

R 如何将.txt文件中的字符串列表转换为数据帧,r,string,dataframe,R,String,Dataframe,我有一个从.txt文件读取的值列表,并试图将其转换为R中的数据帧: .txt数据: l_arr(0, 1, 1) = 0; l_dep(0, 1, 1) = 7.36639; r_arr(0, 1, 1) = 0; r_dep(0, 1, 1) = 0; l_arr(0, 1, 2) = 51.9099; l_dep(0, 1, 2) = 51.9099; r_arr(0, 1, 2) = 0.4; r_dep(0, 1, 2) = 0.4; R中对应的数据帧: 我目前有: df <-

我有一个从.txt文件读取的值列表,并试图将其转换为R中的数据帧:

.txt数据:

l_arr(0, 1, 1) = 0;
l_dep(0, 1, 1) = 7.36639;
r_arr(0, 1, 1) = 0;
r_dep(0, 1, 1) = 0;
l_arr(0, 1, 2) = 51.9099;
l_dep(0, 1, 2) = 51.9099;
r_arr(0, 1, 2) = 0.4;
r_dep(0, 1, 2) = 0.4;
R中对应的数据帧:

我目前有:

df <- data.frame(matrix(ncol = 5))
x <- c("Type", "Angle", "Row", "Boundary", "Timestamp")
colnames(df) <- x

data<-read.csv("SWV_data.txt", header=TRUE, sep = ",")
data<-as.character(data)
temp<-(unlist(strsplit(data,"(")))

我正在努力处理文本字符串,因为一旦我使用as.character,.txt中的整个数据结构就丢失了

您可以尝试使用readLines读取文本文件,替换所有额外的字符,=;对于使用gsub的空空间,在空间上拆分以获得不同的列。使用type.convert将列转换为各自的类型

output <- as.data.frame(do.call(rbind, strsplit(gsub("[,()=;]", " ", 
                        readLines("demo.txt")), "\\s+")))
output <- type.convert(output)
names(output) <- c("Type", "Angle", "Row", "Boundary", "TimeStam")

output
#   Type Angle Row Boundary TimeStam
#1 l_arr     0   1        1     0.00
#2 l_dep     0   1        1     7.37
#3 r_arr     0   1        1     0.00
#4 r_dep     0   1        1     0.00
#5 l_arr     0   1        2    51.91
#6 l_dep     0   1        2    51.91
#7 r_arr     0   1        2     0.40
#8 r_dep     0   1        2     0.40

您可以尝试使用readLines读取文本文件,替换所有额外的字符,=;对于使用gsub的空空间,在空间上拆分以获得不同的列。使用type.convert将列转换为各自的类型

output <- as.data.frame(do.call(rbind, strsplit(gsub("[,()=;]", " ", 
                        readLines("demo.txt")), "\\s+")))
output <- type.convert(output)
names(output) <- c("Type", "Angle", "Row", "Boundary", "TimeStam")

output
#   Type Angle Row Boundary TimeStam
#1 l_arr     0   1        1     0.00
#2 l_dep     0   1        1     7.37
#3 r_arr     0   1        1     0.00
#4 r_dep     0   1        1     0.00
#5 l_arr     0   1        2    51.91
#6 l_dep     0   1        2    51.91
#7 r_arr     0   1        2     0.40
#8 r_dep     0   1        2     0.40
您可以使用readLines,然后删除所有不必要的字符:

nm <- c("Type", "Angle", "Row", "Boundary", "TimeStam")
read.table(text=sub('_',',',gsub('[^A-Z0-9.a-z_]',' ',readLines("a.txt"))),col.names = nm)
   Type Angle Row Boundary TimeStam
1 l,arr     0   1        1  0.00000
2 l,dep     0   1        1  7.36639
3 r,arr     0   1        1  0.00000
4 r,dep     0   1        1  0.00000
5 l,arr     0   1        2 51.90990
6 l,dep     0   1        2 51.90990
7 r,arr     0   1        2  0.40000
8 r,dep     0   1        2  0.40000
您可以使用readLines,然后删除所有不必要的字符:

nm <- c("Type", "Angle", "Row", "Boundary", "TimeStam")
read.table(text=sub('_',',',gsub('[^A-Z0-9.a-z_]',' ',readLines("a.txt"))),col.names = nm)
   Type Angle Row Boundary TimeStam
1 l,arr     0   1        1  0.00000
2 l,dep     0   1        1  7.36639
3 r,arr     0   1        1  0.00000
4 r,dep     0   1        1  0.00000
5 l,arr     0   1        2 51.90990
6 l,dep     0   1        2 51.90990
7 r,arr     0   1        2  0.40000
8 r,dep     0   1        2  0.40000

如果要通过正则表达式匹配创建每一列,可以使用tidyr::extract和捕获组来匹配对应于每一列的文本类型。在本例中,您开始使用的文件结构良好,但在其他情况下可能无法正常工作

txt <- readLines("data.txt")
tidyr::extract(data.frame(txt), txt, 
               into = c("Type", "Angle", "Row", "Boundary", "TimeStam"),
               regex = "(^\\w+)\\((\\d+), (\\d+), (\\d+)\\) = ([\\d.]+);$")

注意,这不会改变每一列都是字符串;如果需要更改,则调用dplyr::mutate_atvars-Type,as.numeric可以快速完成转换。

如果要通过正则表达式匹配创建每一列,可以使用tidyr::extract和捕获组来匹配对应于每一列的文本类型。在本例中,您开始使用的文件结构良好,但在其他情况下可能无法正常工作

txt <- readLines("data.txt")
tidyr::extract(data.frame(txt), txt, 
               into = c("Type", "Angle", "Row", "Boundary", "TimeStam"),
               regex = "(^\\w+)\\((\\d+), (\\d+), (\\d+)\\) = ([\\d.]+);$")

注意,这不会改变每一列都是字符串;如果需要更改,则调用dplyr::mutate_atvars-Type和as.numeric可以快速完成转换。

您需要提供示例数据,而不是图像。您可以使用复制.txt数据,将其粘贴到此处。您需要提供示例数据,而不是图像。您可以使用复制.txt数据,将其粘贴到此处。