我将一个文本文件(tree.txt)加载到R,其中包含以下内容(从JWEKA-J48命令粘贴的副本)。 我使用以下命令加载文本文件:
data3 <-read.table (file.choose(), header = FALSE,sep = ",")
我想将每列插入一个名为COL1,COL2 ... COL8的单独变量(在本例中我们有8列)。如果将其加载到具有分隔分隔的EXCEL,则每行将在一列中分隔(这是所需的结果)。 在此示例中,每个COLn将包含树的相关字符。 如何在忽略文件的页眉和页脚内容的同时自动将文本文件分隔并插入这些列?
这是文本文件内容:
[[1]]
J48 pruned tree
------------------
MSTV <= 0.4
| MLTV <= 4.1: 3 -2
| MLTV > 4.1
| | ASTV <= 79
| | | b <= 1383:00:00 2 -18
| | | b > 1383
| | | | UC <= 05:00 1 -2
| | | | UC > 05:00 2 -2
| | ASTV > 79:00:00 3 -2
MSTV > 0.4
| DP <= 0
| | ALTV <= 09:00 1 (170.0/2.0)
| | ALTV > 9
| | | FM <= 7
| | | | LBE <= 142:00:00 1 (27.0/1.0)
| | | | LBE > 142
| | | | | AC <= 2
| | | | | | e <= 1058:00:00 1 -5
| | | | | | e > 1058
| | | | | | | DL <= 04:00 2 (9.0/1.0)
| | | | | | | DL > 04:00 1 -2
| | | | | AC > 02:00 1 -3
| | | FM > 07:00 2 -2
| DP > 0
| | DP <= 1
| | | UC <= 03:00 2 (4.0/1.0)
| | | UC > 3
| | | | MLTV <= 0.4: 3 -2
| | | | MLTV > 0.4: 1 -8
| | DP > 01:00 3 -8
Number of Leaves : 16
Size of the tree : 31
COL1内容的一个例子是: MSTV | | | | | | | | MSTV | | | | | | | | | | | | | | | | | | | |
COL2内容将是: MLTV MLTV | | | | | | &GT; DP | | | | | | | | | | | | DP | | | | | |
答案 0 :(得分:1)
试试这个:
cleaned.txt <- capture.output(cat(paste0(tail(head(readLines("FILE_LOCATION"), -4), -4), collapse = '\n'), sep = '\n'))
cleaned.df <- read.fwf(file = textConnection(cleaned.txt),
header = FALSE,
widths = rep.int(4, max(nchar(cleaned.txt)/4)),
strip.white= TRUE
)
cleaned.df <- cleaned.df[,colSums(is.na(cleaned.df))<nrow(cleaned.df)]
对于清洁过程,我最终使用头部和尾部的组合来移除顶部和底部的4个空间。在R之外,这可能是一种更有效的方法,但这并不是那么糟糕。通常,我只是让文件对R可读。
您的文件看起来像一个固定宽度的文件,所以我使用read.fwf,并使用textConnection()将函数指向已清理的输出。
最后,我不确定您的数据是如何实际构建的,但是当我从stackoverflow复制它时,它在每行的末尾粘贴了一堆空格。我使用了一些技巧来猜测文件的长度,并删除了无关的列
widths = rep.int(4, max(nchar(cleaned.txt)/4))
cleaned.df <- cleaned.df[,colSums(is.na(cleaned.df))<nrow(cleaned.df)]
接下来,我按照您希望的方式创建数据。
for (i in colnames(cleaned.df)) {
assign(i, subset(cleaned.df, select=i))
assign(i, capture.output(cat(paste0(unlist(get(i)[get(i)!=""])),sep = ' ', fill = FALSE)))
}
rm(i)
rm(cleaned.df)
rm(cleaned.txt)
这样做是为数据框中的每个列标题创建一个循环。
从那里它使用assign()将每列中的所有数据放入其中。自己的数据框架。在您的情况下,它们被命名为V1到V15。
接下来,它使用cat()和paste()与unlist()的组合capture.output()将列表连接成单个字符向量,对于每个数据帧,所以它们现在是字符向量而不是数据帧。
请记住,因为你想在每个新角色上留一个空格,所以我使用空格作为分隔符。但由于这是一个固定宽度的文件,因此某些列完全空白,我将使用
删除它们get(i)[get(i)!=""]
(你的问题说你希望COL2成为:MLTV MLTV | | | | | |&gt; DP | | | | | | | | | | | | DP | | | | | |)。
如果我们只使用get(i),输出中会有一个前导空格。