如何按组合并列以在r中创建新数据框

时间:2014-04-15 18:59:25

标签: r

我想请专家帮我按组(样本)组合不同数量的列。每个样品可以重复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

1 个答案:

答案 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