我想请专家帮我按组(样本)组合不同数量的列。每个样品可以重复1~3次。我需要将重复数据合并到样本中。对于每一行,如果所有重复中的字符值相同,则在每个样本中,只需取一个;如果不同,当存在“AA”或“BB”时忽略“NC”或“AB”;如果重复中只存在“NC”和“AB”,则取“AB”忽略“NC”;如果“AA”和“BB”存在于不同的重复中,则给该数据点“BA”。 数据框是:
df = read.table(text="ID SP01_1 SP01_2 SP02_1 SP02_2 SP03_1 SP03_2 SP03_3
T001 AA AA AA AB AA AB AA
T002 AA AB BB AA AA AA AA
T003 AB AB BB BB AA BB BB
T004 NC NC NC BB BB NC BB
T005 BB AB BB NC AA BB AB
T006 AB BB BB BB NC AB BB
T007 AA NC AA BB AA AA BB
T008 AB BB BB AB BB BB BB", header=T, stringsAsFactors=F)
结果预计为:
ID SP01 SP02 SP03
T001 AA AA AA
T002 AA BA AA
T003 AB BB BA
T004 NC BB BB
T005 BB BB BA
T006 BB BB BB
T007 AA BA BA
T008 BB BB BB
答案 0 :(得分:1)
有多种方法可以做到这一点。我喜欢使用reshape
包。
# Rearrange the data
library(reshape)
mdf = melt(df,id.var="ID")
mdf$variable = substr(mdf$variable,1,4)
mdf$value = as.character(mdf$value)
head(mdf)
# ID variable value
# 1 T001 SP01 AA
# 2 T002 SP01 AA
# 3 T003 SP01 AB
# 4 T004 SP01 NC
# 5 T005 SP01 BB
# 6 T006 SP01 AB
# The function to aggregate the replicates
foo = function(reps) {
if( "AA" %in% reps && "BB" %in% reps ) {
return("BA")
} else {
matches = c("AA","BB","AB","NC")
return( matches[min(match(reps,matches))] )
}
}
现在所有的努力都已完成。
# A function to "cast" the melted data back into a data frame
cast(mdf, ID ~ variable, fun.aggregate=foo )
# ID SP01 SP02 SP03
# 1 T001 AA AA AA
# 2 T002 AA BA AA
# 3 T003 AB BB BA
# 4 T004 NC BB BB
# 5 T005 BB BB BA
# 6 T006 BB BB BB
# 7 T007 AA BA BA
# 8 T008 BB BB BB