如何将R中的数据按以下格式堆叠?
我有一个数据框,看起来像这样:如何将R中的数据按以下格式堆叠?,r,R,我有一个数据框,看起来像这样: 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
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
(以上为两列形式,一列为PROBENAME,另一列为信号强度值)
我希望数据帧按以下方式转换:
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
欢迎提出任何建议。这是一个很大的数据集,我只提供了其中的一小部分以寻求帮助。如果您对
new.probe的值有相同数量的元素,您可以使用:
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
x如果new.probe的值具有相同数量的元素,则可以使用:
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
x这就是我解决这个问题的方法:
确保new.probe
变量已排序
使用sequence()
和rle()
为每个new.probe
生成一个“时间”变量
使用重塑()
转换数据
下面是一个使用示例数据的工作示例(假设它名为“DF”)
或者,如果您更喜欢restrape2
中的语法而不是基本R的restrape
,请将步骤3替换为:
require(reshape2)
dcast(DF, new.probes ~ time, value.var = "inten")
这就是我处理这个问题的方法:
确保new.probe
变量已排序
使用sequence()
和rle()
为每个new.probe
生成一个“时间”变量
使用重塑()
转换数据
下面是一个使用示例数据的工作示例(假设它名为“DF”)
或者,如果您更喜欢restrape2
中的语法而不是基本R的restrape
,请将步骤3替换为:
require(reshape2)
dcast(DF, new.probes ~ time, value.var = "inten")
你试过什么吗??有代码吗?每个探针都有5个值吗?你试过什么吗??有代码吗?每个探针总是有5个值吗?我总是有53个值,大约22800个probes@DhivyaaReddy在这种情况下,do.call(rbind,unstack(dat))
应该可以正常工作。@Andrie,我喜欢你的解决方案,但这给我的印象是另一个restrape()
问题,但缺少“时间”。看,当然,我错过了一条评论,说它们总是有相同数量的值,在这种情况下,这是正确的选择!我总是有53个值,大约22800个probes@DhivyaaReddy在这种情况下,do.call(rbind,unstack(dat))
应该可以正常工作。@Andrie,我喜欢你的解决方案,但这给我的印象是另一个restrape()
问题,但缺少“时间”。看,当然,我错过了一条评论,说它们总是有相同数量的值,在这种情况下,这是正确的选择!