我在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="")))
如何在上面的代码中添加百分比?
最佳答案
我们可以使用apply
和MARGIN = 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%)"