2017-04-03 23 views
0

我有一个文本文件,其格式如下。将文本文件读入数据框,其中一些文本需要标题,而下面的文本需要列值

Main Node 

Node1 

Some ABCD 

Some XYZ 

Node2 

Some VMLK 
Some LPO 

Node3 

LMK 

POL 

TOL 

这需要转换成如下所示的数据帧。

Main Node  Node1   Node2   Node3 
       Some ABCD  Some VMLK  LMK 
       Some XYZ  Some LP  POL 
               TOL 

在这种情况下主节点,节点1,节点2,节点3将是头和它们下面的文本将列值。每行都是每行。

有什么办法中的R

+0

是否有任何固定的数据结构,即在列名称或预定行中发生标题信息的特定模式?如果不是,那么实现你所要求的将会很困难。我举例你给了实际数据? – Vince

+0

@Vince - 列名(标题)将始终相同。列值将始终出现在列名称下方,直到下一列名称不出现为止。 – NinjaR

+0

我猜测一样多。我的答案尝试了一个解决方案,尽管使用'awk'来帮助数据管理。 – Vince

回答

0

我不知道如何在R做到这一点完全实现这一目标。

使用awk我先准备数据:

awk 'BEGIN { OFS=","; print "Node","Value" } $0~/^Node/ { node=$0; next } { print node, $0 } input_data.txt > output_data.txt 

这应该将数据转换是这样的:

Node,Value 
Node1,Some ABCD 
Node1,Some XYZ 
Node2,Some VMLK 
Node2,Some VMLP 
Node3,LMK 
Node3,POL 
Node3,TOL 

然后读入R

df <- read.csv("output_data.txt", header=TRUE) 

library(reshape2) 

dcast(df, Value~Node) 

隐而不宣”没有给你想要的东西,但很接近。

0

这是R中的尝试,尽管不是很简练:

df=read.table("yourpath",sep="\n") 
df=as.character(df[,1]); 
colnames=c("Main Node","Node1","Node2","Node3") 
start=match(colnames,df); 
end=c(match(colnames,df)[-1]-1,length(df)) 
len=end-start; 
df2=data.frame(matrix(NA,ncol=length(colnames),nrow=max(len))) 
colnames(df2)=colnames 
for(j in 1:length(start)) 
{ 
if(len[j]>0) 
{df2[(1:len[j]),j]=df[(start[j]+1):end[j]]} 
} 

这里,缺少的值表示为NA

相关问题