我在R中有以下数据框

    ID     IT      FMCG     CDGS
    A       0       20       50
    B       10      30       67
    C       23      0        40


我想要非零列的百分比份额并在新列中打印。例如快速消费品(20 /(20 + 50))28%

所需的R数据帧

   ID      IT     FMCG    CDGS         Perc_Portfolio
   A        0      20      50        FMCG(28%),CDGS(72%)
   B       10      30      67       IT(10%),FMCG(28%),CDGS(62%)
   C       23      0       40         IT(36%),CDGS(64%)


依此类推,我正在使用以下代码来打印非零列名

simplyfy2array(apply(df[2:4],1,function(x)paste(names(df[2:4])[x!=0],collapse="")))


如何在上面的代码中添加百分比?

最佳答案

我们可以使用applyMARGIN = 1遍历行,对不为0的元素进行子集化,用元素的sum除以创建百分比,并使用paste

df1$perc <- apply(df1[-1], 1, FUN = function(x) {
            x1 <- x[x!=0]
            if(length(x1)==0) {
            ""} else {

          x2 <- round(100*x1/sum(x1))
          paste0(paste(names(x2), paste0(x2, "%"), sep="(", collapse="), "), ")")}})
df1$perc
#[1] "FMCG(29%), CDGS(71%)"         "IT(9%), FMCG(28%), CDGS(63%)" "IT(37%), CDGS(63%)"

08-19 20:00