R 在非零列中查找百分比

R 在非零列中查找百分比,r,R,我在R中有以下数据帧 ID IT FMCG CDGS A 0 20 50 B 10 30 67 C 23 0 40 我想要非零列的百分比份额,并在新列中打印。e、 g快速消费品(20/(20+50))28% 期望R数据帧 ID IT FMCG CDGS Perc_Portfolio

我在R中有以下数据帧

    ID     IT      FMCG     CDGS
    A       0       20       50
    B       10      30       67
    C       23      0        40
我想要非零列的百分比份额,并在新列中打印。e、 g快速消费品(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="")))

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

我们可以使用
apply
MARGIN=1
在行上循环,将非0的元素子集,除以元素的
sum
来创建百分比,并使用
名称
粘贴

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%)"          

df1$perc另一个使用
dplyr的想法

library(dplyr)

df %>% 
 gather(val, var, -ID) %>% 
 filter(var != 0) %>% 
 group_by(ID) %>% 
 summarise(new = toString(paste0(val, '(', round(100*var/sum(var)), "%", ')')))

# A tibble: 3 × 2
#     ID                          new
#  <chr>                        <chr>
#1     A         FMCG(29%), CDGS(71%)
#2     B IT(9%), FMCG(28%), CDGS(63%)
#3     C           IT(37%), CDGS(63%)
库(dplyr)
df%>%
聚集(val,var,-ID)%>%
过滤器(变量!=0)%>%
分组依据(ID)%>%
总结(新=toString(paste0(val,“(”,四舍五入(100*var/sum(var)),“%”,“))))
#一个tibble:3×2
#新身份证
#                          
#1A快速消费品(29%)、CDG(71%)
#2 B IT(9%)、快速消费品(28%)、CDG(63%)
#3 C IT(37%)、CDG(63%)

为什么不包括“%”?而且,即使正确,我觉得您在这里使用粘贴的方式可能会使它有点难以理解。也许使用
paste0(名称(x2),“(”,x2,”)”,collapse=“,”
更容易理解understand@akrun非常感谢,只有一个问题。如果有空行,它仍然打印
(%)
如何避免打印?@Neil你是指数据中的
NA
元素吗。在这种情况下,我们需要执行
x1而不是NA,当一行中有所有的零时,它会打印
(%)
@akrun谢谢。现在它工作得很好。谢谢。你总是帮助我:)非常感谢。感激