如何找到列中不同组的百分比?
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 = TRUE
从 sum
的计算中删除 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)
.
我有一个包含两列(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 = TRUE
从 sum
的计算中删除 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)
.