我有一个数据框,其第一列是样本ID号,然后是井位,如下所示:
>df[1:12,1:10]
S W V3 V4
SID1 A01 <NA> <NA>
SID2 A02 <NA> <NA>
SID3 A03 <NA> <NA>
SID4 A01 <NA> <NA>
SID5 A02 <NA> <NA>
SID5 A03 <NA> <NA>
S列和W列的组合是唯一的,并且必须保持这样,因为一些样本具有重复测量,但是对于下游分析,原因(不在R中)不能放在通常的同一行上。
我希望根据这两列的唯一组合将数据插入数据框。
我试图插入的数据来自另一个数据框,如下所示:
>results[1:12, 1:4]
SampleID Value Assay Well
SID1 0 V3 A01
SID1 0 V4 A01
SID2 1 V3 A02
SID2 2 V4 A02
SID3 0 V3 A03
SID3 1 V4 A03
SID4 0 V3 A01
SID4 0 V4 A01
SID5 1 V3 A02
SID5 2 V4 A02
SID6 0 V3 A03
SID6 1 V4 A03
所以目前我循环遍历列(V3和V4,实际数据集中大约有1000列)并插入每列的数据,一次一个,基于样本ID的唯一组合,井位和测定。这很慢。我希望通过基于样本id和井插入V3的所有值来将其向量化以使其更快。
我试过
for(i in levels(result$Assay))
{
df$V3[(df$V1 %in% results$SampleID)&(df$V2 %in% results$Well]
= results$Value[results$Assay==i]
}
这对我不起作用。我想是因为我有些愚蠢! 有任何想法吗?
修改
实际上,Ben的解决方案几乎无效。 Everythings起初很好,但因为Assays分布在n个文件上,并且当合并尝试将两个dfs连接到测试时,样本分散在y文件上,它已经合并到df中,它添加了一个新列并附加了一个“.1”到最后。
我想你正好想要合并。我没有解释我的数据来自不同的文件。
说明:
我有16个文件。共有1536个样本分布在4个文件中,每个384个。有160个单独的测定,分布在4个测定束中。为每个样品运行每个测定,我最终得到16个文件。
因此,如果我可以合并,如果当前检测的色谱柱已经存在,则不会添加新色谱柱,这将是完美的。
欢迎所有建议,
抱歉在解释我的数据时被废话!
干杯
戴维
答案 0 :(得分:3)
假设您在文件名datafiles
中有文件名,文件1-4是样本1-384的所有分析的数据,5-8样本385-768的所有分析,等等on,并且您希望最终得到1536行乘162列的数据框。
library(reshape)
## read all files into a list of data frames:
alldata <- lapply(datafiles,read.table)
分成四个块:
splitdata <- split(alldata,rep(1:4,each=4))
一个获取n
数据集列表的函数,每个数据集包含来自m
个体的k
个分析(即每个k*m
行为4列:{{ 1}},SampleID
,Well
,Assay
)并将它们组合成一个Value
行k
列长的单个数据集:
n*m+2
现在将其应用于每个块:
mergefun <- function(X) {
cdata <- lapply(X,
cast,
formula=SampleID+Well~Assay,
value="Value")
## produces data sets of the form
## SampleID Well V3 V4
## 1 SID1 A01 0 0
## 2 SID2 A02 1 2
## ...
Reduce(cdata,merge)
}
现在组合块:
merged_data <- lapply(splitdata,mergefun)
我不确定这会有效,但可能会有效。如果第一次尝试不起作用,你应该把它们分开并检查它们分开做什么 - 我可能已经搞砸了。