我有一个要从.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中数据的整个结构就会丢失
答案 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)
之类的调用将快速完成该转换。