用read.table()读取包装文本

时间:2014-08-22 14:40:16

标签: r textwrapping read.table

我有25个变量的数据已从另一个程序输出。对于大多数情况(行),另一个程序将第24和第25个变量的文本包装到下面的行中,如下所示:

v1  v2  v3  v4  v5  v6  v7  v8  v9  v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23
v24 v25

在其他情况下,只有第25个变量包含在下面,如下所示:

v1  v2  v3  v4  v5  v6  v7  v8  v9  v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23
v25

有没有办法将制表符分隔的文件读入R中,以便最后两个变量从每隔一行中获取并根据需要添加到第24和第25列,这样结果将是一个具有25个唯一的对象变量

我认为这可能与在read.table()中使用skip选项有关。

2 个答案:

答案 0 :(得分:1)

这是一种方式。我正在使用带有text参数的scan进行演示,但是您将提供文件的路径。

x <- c("v1  v2  v3  v4  v5  v6  v7  v8  v9  v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23",
"v24 v25", 
"v1  v2  v3  v4  v5  v6  v7  v8  v9  v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23",
"v24 v25")

values <- scan(text=x, what='')
do.call(rbind, split(values, rep(1:(length(values) %/% 25), each=25)))

答案 1 :(得分:0)

你也可以尝试:(使用@Matthew Plourde的x

library(stringr)
indx <- str_count(str_trim(x), " ")==1 #str_trim(x) in case there are leading, trailing spaces, remove it
read.table(text=paste(x[!indx], x[indx]),sep="")
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
#1 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21
#2 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21
#  V22 V23 V24 V25
#1 v22 v23 v24 v25
#2 v22 v23 v24 v25

如果变量之间的空格不是常数,例如

 x1 <- c("v1  v2  v3  v4  v5  v6  v7  v8  v9  v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23",
 "v24     v25", 
 "v1  v2  v3  v4  v5  v6  v7  v8  v9  v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23",
 "v24  v25")


  x1 <- gsub("(?<=[A-Za-z0-9])\\s+(?=[A-Za-z0-9])", " ", x1, perl=TRUE)
  indx <- str_count(str_trim(x1), " ")==1 
  read.table(text=paste(x1[!indx], x1[indx]),sep="")