循环遍历数据框的列,并在条件匹配时填充另一列

时间:2017-09-15 10:31:43

标签: r loops if-statement dataframe apply

我的数据框看起来像这样:

> df
POP A   B   C   D   E
NA  CC  CC  TC  TT  CC
NA  TG  TT  TT  TT  TG
NA  TT  TA  TT  TT  TT
NA  CC  CC  TC  TT  CC
NA  TC  TT  TT  TT  TT
NA  AG  GG  GG  GG  AG
NA  AA  AA  AG  AG  AA
NA  GG  GA  GG  AA  GG
NA  AA  AA  AA  AT  AA

我需要将列A循环到E,并在条件与其他列匹配时填充第一列POP。特别是,我希望得到这样的结果:

> df
POP A   B   C   D   E
C/T CC  CC  TC  TT  CC
G/T TG  TT  TT  TT  TG
A/T TT  TA  TT  TT  TT
C/T CC  CC  TC  TT  CC
C/T TC  TT  TT  TT  TT
A/G AG  GG  GG  GG  AG
A/G AA  AA  AG  AG  AA
A/G GG  GA  GG  AA  GG
A/T AA  AA  AA  AT  AA 

因此,当找到包含两个不同字母的第一列时,请按字母顺序打印由POP分隔的/列中的两个字母。

真实数据框有700列和10000行。

1 个答案:

答案 0 :(得分:0)

这是一个想法:

ind <- apply(sapply(df[-1], function(x) grepl('([A-Z])\\1', x)),
              1,
              function(y) match(FALSE, y))

ind
#[1] 3 1 2 3 1 1 3 2 4

mapply(function(i, j)
    if (!is.na(j))
        paste(sort(strsplit(levels(df[[j]])[df[i, j]], '')[[1]]),
              collapse='/')
    else
        j,
    seq_along(ind), ind + 1)
#[1] "C/T" "G/T" "A/T" "C/T" "C/T" "A/G" "A/G" "A/G" "A/T"
相关问题