我是Stackoverflow和R的新手,所以我希望你能有点耐心,并原谅任何格式错误。
我正在尝试编写一个R脚本,它允许我自动分析qPCR机器的原始数据。
我在清理数据方面非常成功,但在某些时候我遇到了麻烦。我的目标是将数据整合到一个综合表中。
初始数据框(DF)如下所示:
Sample Detector Value
1 A 1
1 B 2
2 A 3
3 A 2
3 B 3
3 C 1
我的目标是将数据框的样本名称作为行名称,将检测器作为列名称。
A B C
1 1 2 NA
2 3 NA NA
3 2 3 1
我的方法
首先,我取出了样本和探测器的名称,并将它们保存在向量中作为因子。
detectors = summary(DF$Detector)
detectors = names(detectors)
samples = summary(DF$Sample)
samples = names(samples)
result = data.frame(matrix(NA, nrow = length(samples), ncol = length(detectors)))
colnames(result) = detectors
rownames(result) = samples
然后我根据数据帧中探测器的名称将探测器子集化为一个新的数据帧。
for (i in 1:length(detectors)){
assign(detectors[i], DF[which(DF$Detector == detectors[i]),])
}
然后我使用正确的列和行名称初始化空数据框:
result = data.frame(matrix(NA, nrow = length(samples), ncol = length(detectors)))
colnames(result) = detectors
rownames(result) = samples
现在问题。我必须将检测器子集中的值导入结果数据帧。重要的是,每个值都能找到通往数据框中正确位置的路径。问题是由于某些样本缺少某些检测器,因此没有相同的值。
我尝试执行以下操作:遍历检测器子集,将rowname(= samplename)相互比较,如果相同,则将值写入新数据帧。如果它不相同,它应该写一个NA。
for (i in 1:length(detectors)){
for (j in 1:length(get(detectors[i])$Sample)){
result[j,i] = ifelse(get(detectors[i])$Sample[j] == rownames(result[j,]), get(detectors[i])$Ct.Mean[j], NA)
}
}
麻烦的是,这会停止通过检测器$ Sample列的迭代,并切换到下一个检测器。我的理解是比较样本不同步,产生以下所有ifelse产生NA。
我试图以某种方式通过编辑ifelse(测试,是,否)NO以j = j + 1来避开它,以使其恢复同步,但遗憾的是这并不起作用。
我希望我能让你的问题易于理解!
期待听到任何建议或评论(以及如何一般改进我的代码;)
答案 0 :(得分:0)
我们可以使用acast
中的library(reshape2)
将'long'格式转换为'wide'格式。
acast(DF, Sample~Detector, value.var='Value') #returns a matrix output
# A B C
#1 1 2 NA
#2 3 NA NA
#3 2 3 1
如果我们需要data.frame
输出,请使用dcast
。
或者使用spread
中的library(tidyr)
,library(tidyr)
spread(DF, Detector, Value)
也会将“样本”作为附加列。
{{1}}