代码之家  ›  专栏  ›  技术社区  ›  Rahul Agarwal

将布尔值列与优先级为r的列组合在一起

  •  0
  • Rahul Agarwal  · 技术社区  · 8 年前

    通过下面的链接,但它部分解决了我的问题。

    merge multiple TRUE/FALSE columns into one

    Combining a matrix of TRUE/FALSE into one

    R: Converting multiple boolean columns to single factor column

    我有一个数据框架,看起来像:

    dat <- data.frame(Id = c(1,2,3,4,5,6,7,8),
                      A = c('Y','N','N','N','N','N','N','N'),
                      B = c('N','Y','N','N','N','N','Y','N'), 
                      C = c('N','N','Y','N','N','Y','N','N'), 
                      D = c('N','N','N','Y','N','Y','N','N'), 
                      E = c('N','N','N','N','Y','N','Y','N')
    
    )
    

    我想用一列来重塑我的df,但是当一行中有2个“y”时,它必须给出优先级。

    优先级是a>b>c>d>e,这意味着如果它们在a中是“y”,则结果值应该是a。同样,在上面的示例中,df c和d都有“y”,但结果df中应该有“c”。 因此,输出应如下所示:

    resultant_dat <- data.frame(Id = c(1,2,3,4,5,6,7,8),
                      Result = c('A','B','C','D','E','C','B','NA')
    )
    

    我尝试过:

    library(reshape2)
    
    new_df <- melt(dat, "Id", variable.name = "Result")
    new_df <-new_df[new_df$value == "Y", c("Id", "Result")]
    

    1 回复  |  直到 8 年前
        1
  •  2
  •   d.b    8 年前
    tmp = data.frame(ID = dat[,1],
                     Result = col_order[apply(
                         X = dat[col_order],
                         MARGIN = 1,
                         FUN = function(x) which(x == "Y")[1])],
                     stringsAsFactors = FALSE)
    tmp$Result[is.na(tmp$Result)] = "Not Present"
    tmp
    #  ID      Result
    #1  1           A
    #2  2           B
    #3  3           C
    #4  4           D
    #5  5           E
    #6  6           C
    #7  7           B
    #8  8 Not Present