我有一些Windows软件生成的数据输出。 它是一个制表符分隔的rtf文件,但在导出时会转换为一个长列数据。 我想使用R将其重新导入数据框以导出为制表符分隔,以便我可以轻松分析数据:
基本上没有分隔符,但我知道在完成的文件中应该有7列,所以我希望数据帧在7个条目进入后开始一个新行。
为了说明,输出如下所示:
>Sample
>Location
>Test
>Mean
>Stdev
>Status
>Points
>A
>A1
>XX1
>0.034541
>0.04596
>UN
>0
>B
>A1
>XX2
>0
>0
>TA
>1
我想解析它:
>Sample Location Test Mean Stdev Status Points >A A1 XX1 0.03 0.04 UN 0 >B A1 XX2 0 0 TA 1
我不完全确定如何搜索这个,但最接近我想做的例子就是这个例子:
writing contents of list to one file in R
但我无法弄清楚如何应用我的数据的答案,特别是设置宽度选项(我没有完全遵循,但可能是关于列号?),capture.output和两个列表元素我不认为适用于此。
也对BASH或awk解决方案开放。
答案 0 :(得分:4)
这里有一套完整的步骤可以帮助您完成。
正常读取文件
d = read.table("/tmp/tmp.txt", header=FALSE, stringsAsFactors=FALSE)
这为一个数据框提供了一列。
接下来我们改变行数和列数:
d = unlist(d)
dim(d) = c(7, nrow(d)/7)
d = t(d)
##Or
d = matrix(as.matrix(d), ncol=7, byrow=TRUE)
然后我们删除“>”符号:
d = gsub(">", "", d)
这里我们替换“>”什么都没有“”
然后整理列标题:
colnames(d) = d[1,]
d = d[-1,]
答案 1 :(得分:2)
我想你想要这样的东西:
# Read data
x<-read.table(textConnection('>Sample
>Location
>Test
>Mean
>Stdev
>Status
>Points
>A
>A1
>XX1
>0.034541
>0.04596
>UN
>0
>B
>A1
>XX2
>0
>0
>TA
>1'),stringsAsFactors=FALSE)
# Convert to matrix
mat<-matrix(as.matrix(x),ncol=7,byrow=TRUE)
# Dump as tab delimited
write.table(mat,'file.tab',sep='\t')
答案 2 :(得分:1)
与其他解决方案类似,我保留它,因为有进一步的处理:
matrix(gsub('>','',dat$V1),ncol=7,byrow=T)
colnames(dat) <- dat[1,]
> dat <- dat[-1,]
> dat
Sample Location Test Mean Stdev Status Points
[1,] "A" "A1" "XX1" "0.034541" "0.04596" "UN" "0"
[2,] "B" "A1" "XX2" "0" "0" "TA" "1"