如何找到列中不同组的百分比?

How can I find the percentage of different groups within a column?

我有一个包含两列(Vannstand2Positive 和 Vannstand2Negative)的数据框 (sy2.1),由于对现有列中的列进行了变异,它们都包含 NA。我还有包含时间和日期的第三列 (t),以及包含 4 个类别的第四列 (Kategori)。我想找到具有 Vannstand2Positive 和 Vannstand2Negative 值的 4 个类别中每个类别的百分比。

这是我使用过的代码,其中我在这段代码中只使用了具有正值(Vannstand2Positive)的列。

sy2.1 %>% 
  filter(year(t)==2005) %>% 
  group_by(Kategori, year(t)) %>% 
  dplyr::summarise(sum_vannstandPos = sum(Vannstand2Positive)) %>% 
  dplyr::mutate(percent_vannstandPos=sum_vannstandPos/sum(sum_vannstandPos)*100)


#    Kategori year(t) sum_VannstandPos percent_VannstandPos
# 1:  Liten    2005           NA                 NA
# 2: Moderat   2005          1107               100
# 1:  Stor     2005           609               100
# 2: Størst    2005          1107               100

代码显然有问题,因为所有类别的百分比都是 100%,但我需要正确计算百分比。 我也尝试在具有负值的列 (Vannstand2Negative) 上使用它,但我只在 table 上得到了 NA。但我知道完全有可能找到负值的百分比。谁有可以解决此问题的代码?

通过将 na.rm=T 添加到 sum 函数,我得到了除第一组之外的几乎所有组的百分比:

#    Kategori year(t) sum_VannstandPos percent_VannstandPos
# 1:  Liten    2005           NA                 NA
# 2: Moderat   2005          1107               32.34005
# 1:  Stor     2005           609               17.79141
# 2: Størst    2005          1107               49.86854

添加 ungroup() 如下面的可重现示例。

iris %>% 
  group_by(Species) %>% 
  summarize(sum_Petal.Length = sum(Petal.Length, na.rm = TRUE)) %>% 
  ungroup() %>% 
  mutate(
    precentage = sum_Petal.Length / sum(sum_Petal.Length, na.rm = TRUE)
  )

使用 na.rm = TRUEsum 的计算中删除 NA 值。您可以在 summarise 中使用 .groups = 'drop' 来删除分组,并且由于您不止一次使用 year(t),最好创建一个包含年份信息的新列。

library(dplyr)
library(lubridate)

result <- sy2.1 %>% 
  mutate(year = year(t)) %>%
  filter(year==2005) %>% 
  group_by(Kategori, year) %>% 
  dplyr::summarise(sum_vannstandPos = sum(Vannstand2Positive, na.rm = TRUE), 
                  .groups = 'drop') %>% 
  dplyr::mutate(percent_vannstandPos= prop.table(sum_vannstandPos)*100)

result

prop.table(sum_vannstandPos) 是另一种写法 sum_vannstandPos/sum(sum_vannstandPos).