如何安排检测单词的文件

时间:2016-02-18 17:48:44

标签: r

我的数据看起来像这样

Peak Ret. Time: 2.083 Min
Number of Points: 6
187.0   194009.0
188.0   308396.0
189.0   319163.0
190.0   321506.0
191.0   321962.0
192.0   321474.0
Peak Ret. Time: 2.683 Min
Number of Points: 6
187.0   194009.0
188.0   308396.0
189.0   319163.0
190.0   321506.0
191.0   321962.0
192.0   321474.0
Peak Ret. Time: 2.417 Min
Number of Points: 4
187.0   20844.0
188.0   30229.0
189.0   31131.0
190.0   30874.0
Peak Ret. Time: 2.667 Min
Number of Points: 8
187.0   59137.0
188.0   75392.0
189.0   64461.0
190.0   51970.0
191.0   41550.0
192.0   33235.0
193.0   22146.0
194.0   19069.0

我想要这样的数据

Peak Ret. Time: 2.083 Min   2.683 Min   2.417 Min   2.667 Min

187              194009      194009      20844      59137
188              308396      308396      30229      75392
189              319163      319163      31131      64461
190              321506      321506      30874      51970
191              321962     321962        0         41550
192              321474     321474        0         33235
193                0           0          0         22146
194                0           0          0         19069

首先,我想搜索具有最长点数的数据(在这种情况下它是8)然后我将其第一列用于新数据。然后我从第一列中删除所有其他部分,因为它一遍又一遍地重复,但长度不同或相等。然后我把第一部分的第二列(2.083分钟)然后是第二部分的第二列等直到结束。最后,我用零填充空格。

2 个答案:

答案 0 :(得分:1)

我们用readLines读取数据,然后得到那些以数字('i1')开头的行的索引,带'Peak'('nm1')。使用sub'从'nm1'中提取'Peak'值,并提取创建标题的Time值。

我们split以数字(lines[i1])开头的“行”和我们使用“i1”创建的分组向量,使用fread读取数据(来自data.table })。我们将每个'lst'元素的列名更改为'nm2',然后将merge的元素更改为list的第一列'Peak'

library(data.table)
i1 <- grep('^\\d+', lines)
nm1 <- grep('^Peak', lines, value=TRUE)
nm2 <- c(unique(sub('\\s+.*', '', nm1)),
     sub('.*:\\s+', '', nm1) )

lst <- lapply(lapply(split(lines[i1],
   cumsum(c(TRUE,diff(i1)!=1))), paste, collapse='\n'), 
       fread, header=FALSE)
lst1 <- lapply(seq_along(lst), function(i) 
       setnames(lst[[i]],  c(nm2[1],nm2[-1][i])))
 res <-  Reduce(function(...) merge(..., by = 'Peak', all=TRUE),lst1)
dim(res)
#[1] 427  58
res[1:3, 1:3, with=FALSE]
#   Peak 2.083 Min 2.417 Min
#1:  187    194009     20844
#2:  188    308396     30229
#3:  189    319163     31131

数据

path <- "https://gist.githubusercontent.com/anonymous/3d40de7d2cb6d5ab97e5/raw/2412d824ca31ba7a927d5c46f7b091e69eb6b400/sam.asc"
lines <- readLines(path)

答案 1 :(得分:1)

我们可以创建Peak行的索引,并使用它来对原始数据框进行子集化。我们还从同一个索引创建一个名称列,并将额外的文本分出来。然后从剩余的文本中创建一个数据框。使用read.table该功能会为我们分隔粘贴的值,以便为dcast做好准备:

library(reshape2)
ind1 <- grepl("Peak", mydata$V1)
mydata$names <- sub(".*: ", "", mydata$V1[ind1][cumsum(ind1)])
ndf <- read.table(text=do.call(paste, mydata[!(ind1|grepl("Number", mydata$V1)),c("V1", "names")]))
dcast(ndf, V1~paste(V3,V4), value.var="V2", fill=0L)
#    V1 2.083 Min 2.417 Min 2.667 Min 2.683 Min
# 1 187    194009     20844     59137    194009
# 2 188    308396     30229     75392    308396
# 3 189    319163     31131     64461    319163
# 4 190    321506     30874     51970    321506
# 5 191    321962         0     41550    321962
# 6 192    321474         0     33235    321474
# 7 193         0         0     22146         0
# 8 194         0         0     19069         0