【问题标题】:Loop over columns of data frame and populate another column if condition matched如果条件匹配,则循环遍历数据框的列并填充另一列
【发布时间】:2023-04-10 20:04:01
【问题描述】:

我有一个如下所示的数据框:

> 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 行。

【问题讨论】:

  • 这看起来像是大学时的基本练习。看起来很简单,所以请考虑一下。

标签: r loops if-statement dataframe apply


【解决方案1】:

这是一个想法:

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多