【问题标题】:How to get percentage value of each column across all rows in R如何在R中的所有行中获取每列的百分比值
【发布时间】:2019-03-14 15:47:28
【问题描述】:

使用 R 的 tidyverse,我如何获得跨行每列的 百分比 值?以mpg数据集为例,我试过如下代码:

new_mpg <- mpg %>%
  group_by(manufacturer, model) %>%
    summarise (n = n()) %>% 
      spread(model, n) %>% 
        mutate_if(is.integer, as.numeric)

new_mpg[,-1] %>% 
  mutate(sum = rowSums(.))

我正在寻找创建以下输出:

manufacturer | 4runner4wd |     a4    | a4 quattro | a6 quattro | altima |
--------------------------------------------------------------------------
audi         |     NA     | 0.3888889 |   0.444444 | 0.166667   |   NA   |

然而,当我到达

new_mpg[,-1] %>% 
      mutate(sum = rowSums(.))

sum 列返回 NA。而且我无法计算 n()/sum。我只会得到NA。任何想法如何解决这个问题?

【问题讨论】:

  • 在您的总和中添加na.rm = TRUE。许多聚合函数(如summean 等)默认为NA(如果任何值为NA)作为故障保护
  • 另外,请记住,从所有模型中创建列意味着您将拥有大量不适用于行的列。如果您想要的只是组内的比例,有更好的方法可以做到这一点,或者将数据保持长形,或者按制造商拆分。

标签: r dplyr percentage


【解决方案1】:

正如 @camille 在 cmets 中提到的,您需要在 rowSums 调用中使用 na.rm = TRUE。要获得制造商中每个型号的百分比,您需要首先计算按制造商和型号分组的每个型号的数量,然后获得仅按制造商分组的百分比。 dplyr 在这种方式上很聪明,因为它在 summarise 之后删除了一层分组,所以你只需要添加一个 mutate:

library(dplyr)
library(tidyr)
library(ggplot2)
new_mpg <- mpg %>%
  group_by(manufacturer, model) %>%
  summarise (n = n()) %>% 
  mutate(n = n/sum(n)) %>% 
  spread(model, n) %>% 
  mutate_if(is.integer, as.numeric)

new_mpg[,-1] %>% 
  mutate(sum = rowSums(., na.rm = TRUE))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2018-12-24
    • 2022-08-04
    • 1970-01-01
    • 2021-11-17
    • 2018-07-12
    相关资源
    最近更新 更多