R 如何分解不同复制的列、条件所采用的字符值

R 如何分解不同复制的列、条件所采用的字符值,r,R,我有一个data.frame看起来像: mi pos L08.92.s1 L08.92.s2 LD09.911.s1 LD09.911.s2 Storn.s1 Storn.s2 Storn.s3 Storn.s4 Tre 1 snp1 12713760 CC CT CC CC TT TT TT TT CC 2 snp2 8219379 AA

我有一个
data.frame
看起来像:

    mi      pos L08.92.s1 L08.92.s2 LD09.911.s1 LD09.911.s2 Storn.s1 Storn.s2 Storn.s3 Storn.s4 Tre
1 snp1 12713760        CC        CT          CC          CC       TT       TT       TT       TT  CC
2 snp2  8219379        AA        AA          --          AA       AA       AA       AA       AA  --
3 snp3  6595215        GG        GG          GG          GG       GG       --       GG       GT  GT
4 snp4 42348146        CC        CC          CC          CC       CC       CA       --       CA  AA
5 snp5  1809563        GG        GG          TT          TG       GG       GG       GG       GG  TT
6 snp6 34285723        TT        CC          --          --       TT       TT       TT       TT  CC
7 snp7 21533194        AA        AA          AG          --       AA       GG       GG       GG  AG
我希望最终的数据帧如下所示:

    mi      pos L08.92 LD09.911 Storn Tre
1 snp1 12713760     CC       CC    TT  CC
2 snp2  8219379     AA       AA    AA  --
3 snp3  6595215     GG       GG    GG  GT
4 snp4 42348146     CC       CC    CC  AA
5 snp5  1809563     GG       TT    GG  TT
6 snp6 34285723     HH       --    TT  CC
7 snp7 21533194     AA       AG    HH  AG
步骤:对于每个样本,具有复制的色谱柱将分解为一个色谱柱。该值将按照以下规则从复制中获取:

  • 如果所有复制的值相同,则无变化
  • 接受值的优先级顺序是:两个相同的字母>两个 不同字母>“--”
  • 如果复制之间存在两种类型的“homo”值,则更改为“HH”
谢谢你的帮助

你可以试试

indx <- gsub("[.][^.]+$", "", colnames(df)[-(1:2)])
lst <- split(colnames(df)[-(1:2)], indx)
Un <- c('AA', 'CC', 'GG', 'TT')

df2 <- df[,1:2]
df2[unique(indx)] <- lapply(lst, function(x)
         apply(df[x], 1, function(y) {y1 <- unique(y)
                  y2 <- y1[y1 %in% Un]
                 ifelse(length(y2)==0, sort(y1, decreasing=TRUE),
                   ifelse(length(y2)==2, 'HH', y2))
               }))

df2
#    mi      pos L08.92 LD09.911 Storn Tre
#1 snp1 12713760     CC       CC    TT  CC
#2 snp2  8219379     AA       AA    AA  --
#3 snp3  6595215     GG       GG    GG  GT
#4 snp4 42348146     CC       CC    CC  AA
#5 snp5  1809563     GG       TT    GG  TT
#6 snp6 34285723     HH       --    TT  CC
#7 snp7 21533194     AA       AG    HH  AG
indx您可以试试

indx <- gsub("[.][^.]+$", "", colnames(df)[-(1:2)])
lst <- split(colnames(df)[-(1:2)], indx)
Un <- c('AA', 'CC', 'GG', 'TT')

df2 <- df[,1:2]
df2[unique(indx)] <- lapply(lst, function(x)
         apply(df[x], 1, function(y) {y1 <- unique(y)
                  y2 <- y1[y1 %in% Un]
                 ifelse(length(y2)==0, sort(y1, decreasing=TRUE),
                   ifelse(length(y2)==2, 'HH', y2))
               }))

df2
#    mi      pos L08.92 LD09.911 Storn Tre
#1 snp1 12713760     CC       CC    TT  CC
#2 snp2  8219379     AA       AA    AA  --
#3 snp3  6595215     GG       GG    GG  GT
#4 snp4 42348146     CC       CC    CC  AA
#5 snp5  1809563     GG       TT    GG  TT
#6 snp6 34285723     HH       --    TT  CC
#7 snp7 21533194     AA       AG    HH  AG
indx