[英]Inserting data into a data frame based on the unique combination of two factors
我有一个数据框,其第一列是样本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个文件。
因此,如果我可以合并,如果当前测定的色谱柱已经存在,则不添加新色谱柱,这将是完美的。
欢迎所有建议,
抱歉在解释我的数据时被废话!
干杯
戴维
假设您在矢量datafiles
文件中有文件名,文件1-4是样本1-384的所有分析的数据,样本385-768的所有分析的5-8,等等,并且您想要最终得到一个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
数据集的列表,每个数据集包含来自k
个体的m
测定(即每个数据是k*m
行×4列: 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)
现在组合块:
final <- do.call(rbind,merged_data)
我不确定这会有效,但可能会有效。 如果第一次尝试不起作用,你应该把它们分开并检查它们分开做什么 - 我可能已经搞砸了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.