如何根据重复值重新排列数据

时间:2016-02-19 09:06:48

标签: 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.667 Min
Number of Points: 6
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

我希望输出的内容如下所示

      187point  188point    189point    190point    191point    192point
2.083   194009  308396      319163      321506      321962      321474
2.683   194009  308396      319163      321506      321962      321474
2.667   59137   75392       64461       51970       41550       33235

最后,一个图中的第一列与所有其他列的图也是受欢迎的。这里粘贴了读取数据的示例。

3 个答案:

答案 0 :(得分:2)

我会在" data.table"中使用fread读取该文件,然后在进行一些修改后使用dcast重新整形数据。

以下为您分享的示例对我有用:

library("data.table")
x <- fread("https://gist.githubusercontent.com/anonymous/3d40de7d2cb6d5ab97e5/raw/2412d824ca31ba7a927d5c46f7b091e69eb6b400/sam.asc", header = FALSE)

这是dcast步骤:

out <- dcast(x[, c("peak_ret_time", "N") := list(V2[1], sequence(.N)), 
               by = cumsum(grepl("Peak", V1))][N > 2], 
             peak_ret_time ~ V1, value.var = "V2")

如果要将值转换为数字,也可以执行以下操作:

out[, (names(out)) := lapply(.SD, type.convert)]

dim(out)与预期值进行比较。列数大于值的数量,因为第一列是&#34; peak_ret_time&#34;。

dim(out)
# [1]  57 428

sum(grepl("Peak", x$V1))
# [1] 57

unique(x$V2[grepl("Number", x$V1)])
# [1] "427"

out[1:6, 1:6, with = FALSE]
##    peak_ret_time    187.0    188.0    189.0    190.0    191.0
## 1:    16.217 Min  30718.0  38885.0  32012.0  24276.0  18139.0
## 2:    17.433 Min  52646.0  69443.0  59216.0  47639.0  37672.0
## 3:    18.617 Min  58199.0  84889.0  71242.0  55595.0  42094.0
## 4:    19.183 Min  66975.0  97531.0  82464.0  64679.0  49354.0
## 5:     2.083 Min 194009.0 308396.0 319163.0 321506.0 321962.0
## 6:     2.417 Min  20844.0  30229.0  31131.0  30874.0  30638.0

答案 1 :(得分:1)

我们可以从here

进行res的转置
 res1 <- t(res)
 res2 <- res1[-1,]
 colnames(res2) <- as.character(res1[1,])
 res2[1:3,1:3]
 #           187    188    189
 #2.083 Min 194009 308396 319163
 #2.417 Min  20844  30229  31131
 #2.667 Min  59137  75392  64461

答案 2 :(得分:1)

我可能过于复杂了。但是这是我对此的尝试,这可能解释了点数不能保持不变的情况。

require(reshape2)
x <- readLines("https://gist.githubusercontent.com/anonymous/3d40de7d2cb6d5ab97e5/raw/2412d824ca31ba7a927d5c46f7b091e69eb6b400/sam.asc")
x <- read.table(text = x, sep = "\t", stringsAsFactors=F)
temp <- unlist(apply(cbind(x[grep("^Peak", x$V1),2], x[grep("^Number", x$V1),2]), 1, 
               function(x) list(rep(x[1], times = as.numeric(x[2])))))
x <- x[grep("^Peak|^Number", x$V1, invert=T),]
x <- cbind(temp, x) 
x <- dcast(x, temp ~ V1, value.var="V2")

无论如何,练习破解奇怪的数据结构很有趣。