我有一个数据框,看起来像这样:
inten new.probes
12.28280 AFFX-r2-P1-cre-5_at
12.35039 AFFX-r2-P1-cre-5_at
12.38397 AFFX-r2-P1-cre-5_at
12.36304 AFFX-r2-P1-cre-5_at
12.16271 AFFX-r2-P1-cre-5_at
12.70304 AFFX-r2-P1-cre-3_at
12.28280 AFFX-r2-P1-cre-3_at
12.35039 AFFX-r2-P1-cre-3_at
12.38397 AFFX-r2-P1-cre-3_at
12.36304 AFFX-r2-P1-cre-3_at
12.16271 AFFX-r2-P1-cre-2_at
12.70304 AFFX-r2-P1-cre-2_at
12.16271 AFFX-r2-P1-cre-2_at
12.70304 AFFX-r2-P1-cre-2_at(上面的形式是两个单独的列,其中probenames为一列,信号强度值为另一列),我希望数据帧按以下方式转换:
AFFX-r2-P1-cre-5_at 12.28280 12.35039 12.38397 12.36304 12.16271
AFFX-r2-P1-cre-3_at 12.28280 12.35039 12.38397 12.36304 12.16271
AFFX-r2-P1-cre-2_at 12.38304 12.36304 12.38397 12.16271 12.70304欢迎提出任何建议。这是一个很大的数据集,我只提供了其中的一小部分作为帮助。
发布于 2012-08-13 21:48:57
如果new.probes的值具有相同数量的元素,则可以使用:
do.call(rbind, unstack(dat))
[,1] [,2] [,3] [,4] [,5]
AFFX-r2-P1-cre-2_at 12.16271 12.70304 12.16271 12.70304 12.16271
AFFX-r2-P1-cre-3_at 12.70304 12.28280 12.35039 12.38397 12.36304
AFFX-r2-P1-cre-5_at 12.28280 12.35039 12.38397 12.36304 12.16271
Warning message:
In function (..., deparse.level = 1) :
number of columns of result is not a multiple of vector length (arg 1)但这显然是错误的-您需要用NA填充较短的向量
x <- unstack(dat)
m <- max(sapply(x, length))
do.call(rbind, lapply(x, function(x)c(x, rep(NA, m-length(x)))))
[,1] [,2] [,3] [,4] [,5]
AFFX-r2-P1-cre-2_at 12.16271 12.70304 12.16271 12.70304 NA
AFFX-r2-P1-cre-3_at 12.70304 12.28280 12.35039 12.38397 12.36304
AFFX-r2-P1-cre-5_at 12.28280 12.35039 12.38397 12.36304 12.16271发布于 2012-08-14 01:00:20
这就是我解决这个问题的方法:
new.probes变量已排序。sequence()和rle()为每个时间生成“reshape()”变量以转换数据。下面是一个使用示例数据的工作示例(假设它被命名为"DF")。
DF = DF[order(DF$new.probes), ]
DF$time = sequence(rle(as.vector(DF$new.probes))$lengths)
reshape(DF, direction = "wide", idvar = "new.probes", timevar = "time")
# new.probes inten.1 inten.2 inten.3 inten.4 inten.5
# 11 AFFX-r2-P1-cre-2_at 12.16271 12.70304 12.16271 12.70304 NA
# 6 AFFX-r2-P1-cre-3_at 12.70304 12.28280 12.35039 12.38397 12.36304
# 1 AFFX-r2-P1-cre-5_at 12.28280 12.35039 12.38397 12.36304 12.16271或者,如果您更喜欢reshape2中的语法,而不是基于R的reshape,请将步骤3替换为:
require(reshape2)
dcast(DF, new.probes ~ time, value.var = "inten")https://stackoverflow.com/questions/11934827
复制相似问题