我的数据看起来像这样
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分钟)然后是第二部分的第二列等直到结束。最后,我用零填充空格。
答案 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