如何在 R 中创建一个函数来返回表中每个数字的百分比并跳过任何 0 数字

问题描述

我需要使用 R 在表中创建一个函数,该函数返回以水平顺序移动,并且不计算任何 0 数。例如见下表:

1  3 11
0  1  1
2  1  4
0  1  5
0  1  4

一个数字将被计算为 1/15*100 = 7%, 然后下一个将是 2/7*100 = 29% 然后下一个将是 3/15*100... 0 个号码将被跳过。

解决方法

我们可以沿着 proportions 使用 margin = 1,例如,

> proportions(as.matrix(df),1)
             V1        V2        V3
[1,] 0.06666667 0.2000000 0.7333333
[2,] 0.00000000 0.5000000 0.5000000
[3,] 0.28571429 0.1428571 0.5714286
[4,] 0.00000000 0.1666667 0.8333333
[5,] 0.00000000 0.2000000 0.8000000

数据

> dput(df)
structure(list(V1 = c(1L,0L,2L,0L),V2 = c(3L,1L,1L),V3 = c(11L,4L,5L,4L)),class = "data.frame",row.names = c(NA,-5L))
,

我们可以在apply中使用base R

100 *df/apply(df,1,sum)
         V1       V2       V3
1  6.666667 20.00000 73.33333
2  0.000000 50.00000 50.00000
3 28.571429 14.28571 57.14286
4  0.000000 16.66667 83.33333
5  0.000000 20.00000 80.00000
,

您可以使用按行求和来划分数据帧。

res <- df/rowSums(df) * 100
res
#         V1       V2       V3
#1  6.666667 20.00000 73.33333
#2  0.000000 50.00000 50.00000
#3 28.571429 14.28571 57.14286
#4  0.000000 16.66667 83.33333
#5  0.000000 20.00000 80.00000

要忽略 0 个值,您可能需要将它们转换为 NA

res[res == 0] <- NA
res