如何从R逐行读取水平文件到表

时间:2016-04-07 12:58:46

标签: r

我想阅读

中描述的文件

http://snap.stanford.edu/data/wiki-RfA.html

进入R的数据框。

我知道函数read.table,但我认为它仅适用于垂直表。

我应该如何阅读上面的文件。

文件格式为:

SRC:Guettarda
TGT:Lord Roem
VOT:1
RES:1
YEA:2013
DAT:19:53, 25 January 2013
TXT:'''Support''' per [[WP:DEAL]]: clueful, and unlikely to break Wikipedia.

所以我想将文件读入一个包含7列SRC, TGT, ... TXT的数据框。

2 个答案:

答案 0 :(得分:0)

这是一个使用readLines

的方法
dataStartPosn <- 5
nfields <- 7
TXTmaxLen <- 1e3
eachColnameLen <- 3

#download and read lines
temp <- tempfile()
download.file("http://snap.stanford.edu/data/wiki-RfA.txt.gz",temp)
dataLines <- readLines(gzfile(temp, "r"))

library(plyr)
library(stringi)

#extract data
data <- stri_sub(dataLines, dataStartPosn, length=TXTmaxLen)

#extract colnames
colnames <- unname(sapply(dataLines[1:(nfields+1)], function(x) substring(x, 1, eachColnameLen)))

#form table
df <- data.frame(do.call(rbind, split(data, ceiling(seq_along(data)/(nfields+1)))))

#formatting
df <- setNames(df, colnames)
df[-(nfields+1)]

评论中提到的替代方法太慢了

SRC <- read.csv(pipe("sed -n '1~8p' wiki-RfA.txt"))
TGT <- read.csv(pipe("sed -n '2~8p' wiki-RfA.txt"))

答案 1 :(得分:-1)

这是优雅的解决方案。 我将你的例子保存到ascii文件&#34; testdat&#34;。您可能首先要考虑的一件事是您的分隔符也会在您的数据中出现。这使得处理数据变得更加困难,并且在写入数据之前更改它应该是相当简单的。我将其更改为...

SRC;海岸桐属

TGT; Lord Roem

VOT; 1

RES; 1

YEA; 2013

DAT; 2013年1月25日19:53

TXT;&#39;&#39;&#39;支持&#39;&#39;&#39; per [[WP:DEAL]]:有头脑,不太可能破坏维基百科。

即。用分号代替分隔冒号。

然后很容易,

t<-read.table("testdat", stringsAsFactors=F, sep=";")

p=as.data.frame(t(t$V2), stringsAsFactors=F) 

colnames(p)<-t$V1

那么p就是你想要的