如何从R上的表格计算百分比

时间:2019-02-05 11:48:52

标签: r math percentage

Hello,

我有一张桌子,上面有14个观察值和16个变量。 (S0至S11和末尾的行之和) 我想计算每个值在总数中所占的百分比(最后一列)。 我尝试了prop.table,但没有给我正确的百分比。我也试过申请但相同的铅。

这是我的桌子的一个样本:

Row.name    S0  S1  S2  S3  S4  S5  Total
     S0     25987   269 9152    6042    30  32  41512
     S1     234 5575    768 4398    3321    34  14330
     S2     345546  35  79  245 21685   676 368266
     S3     5678    6   78  987 4657    789 12195
     S4     9   45  879 34  5768    246 6981
     S5     54  3   788 863 56  279826  281590
     S6     367 57678   12  842 436 5824    65159 

The code I've tried : 

prop.table(df)

prop <- apply(df, 1, function(x) x/ df$Total*100)

例如,对于第一行,我想 (25987/41512)* 100(269/41512)* 100(269/41512)* 100等

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

尝试:

prop <- apply(df, 2,function(x,y) (x/y)*100, df$Total)

您可以从?apply中看到,第二个参数是:

  

一个给出下标的向量,该函数将被应用到下标。例如,对于矩阵   1表示行,2表示列

因此,由于要计算跨列的百分比,因此应使用2而不是1。 此外,您的lambda函数还需要一个额外的参数:它是每一行的总计字段。 同样,如您从?apply所读,该函数的所有那些可选参数都应在apply的末尾。

最后,请澄清一下,您还将创建一个始终为1的最终列,因为最后一列的百分比(总计)也将使用apply计算。

最好!

答案 1 :(得分:1)

prop.table()给出默认值占总数的比例,但是具有margin参数来计算行或列的百分比。我认为prop.table(df[,2:7], margin = 1) * 100应该有用。其中1表示要计算行比例(2表示列比例)。 2:7索引排除了Total列和Row.name列,因为这些对于该功能不是必需的。

编辑:根据df的类,可能有必要先将其转换为矩阵。 prop.table(as.matrix(df[,2:7]), margin = 1) * 100在这种情况下应该可以使用。

答案 2 :(得分:0)

您可以使用tidyverse功能 gathermutateselectspread

加载包和数据:

library(dplyr)
library(tidyr)
sampletable <- "Row.name    S0  S1  S2  S3  S4  S5  Total
S0     25987   269 9152    6042    30  32  41512
S1     234 5575    768 4398    3321    34  14330
S2     345546  35  79  245 21685   676 368266
S3     5678    6   78  987 4657    789 12195
S4     9   45  879 34  5768    246 6981
S5     54  3   788 863 56  279826  281590
S6     367 57678   12  842 436 5824    65159 "
dtf <- read.table(text= sampletable, header = TRUE)
# I prefer lowercase names
names(dtf) <- tolower(names(dtf))

以长格式转换数据,每行一次观察

dtflong <- dtf %>% 
    gather(col.name, value, -row.name, -total) %>% 
    mutate(percent = round(value / total *100, 2))
head(dtflong)
  row.name  total col.name  value percent
1       S0  41512       s0  25987   62.60
2       S1  14330       s0    234    1.63
3       S2 368266       s0 345546   93.83
4       S3  12195       s0   5678   46.56
5       S4   6981       s0      9    0.13
6       S5 281590       s0     54    0.02

以宽幅格式重塑

dtflong %>% 
    select(-total, -value) %>% 
    spread(col.name, percent)

  row.name    s0    s1    s2    s3    s4    s5
1       S0 62.60  0.65 22.05 14.55  0.07  0.08
2       S1  1.63 38.90  5.36 30.69 23.18  0.24
3       S2 93.83  0.01  0.02  0.07  5.89  0.18
4       S3 46.56  0.05  0.64  8.09 38.19  6.47
5       S4  0.13  0.64 12.59  0.49 82.62  3.52
6       S5  0.02  0.00  0.28  0.31  0.02 99.37
7       S6  0.56 88.52  0.02  1.29  0.67  8.94

(可选)检查总计列是否正确

dtflong %>% 
    group_by(row.name, total) %>% 
    summarise(total2 = sum(value)) %>% 
    mutate(diff = total2 - total)
# A tibble: 7 x 4
# Groups:   row.name [7]
  row.name  total total2  diff
  <fct>     <int>  <int> <int>
1 S0        41512  41512     0
2 S1        14330  14330     0
3 S2       368266 368266     0
4 S3        12195  12195     0
5 S4         6981   6981     0
6 S5       281590 281590     0
7 S6        65159  65159     0