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

时间:2019-11-25 03:38:27

标签: 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中相应的数据帧:

corresponding dataframe in 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中数据的整个结构就会丢失

3 个答案:

答案 0 :(得分:3)

您可以尝试使用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

答案 1 :(得分:2)

您可以使用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

答案 2 :(得分:0)

如果要通过正则表达式匹配创建每一列,则可以将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_at(vars(-Type), as.numeric)之类的调用将快速完成该转换。