对子组进行分组时计算百分比

问题描述 投票:0回答:1

我有以下数据框(这是一个示例):

df <- data.frame(groupID = c("Jon", "Jon", "Jon","Jon", "Jon", "Maria", "Maria", "Ben", "Ben", "Tina", "Tina"),
                 breeding_attempt = c(1, 1, 1, 2, 2, 1, 1 , 1, 1, 1, 1),
                 year = c(1999, 1999, 1999, 1999, 1999, 2000, 2000, 2000, 2000, 2001, 2001),
                 femaleID = c("Jony", "Jona", "sami", "Jon", "Jona", "aa", "BB", "Tana", "tt", "gg", "HH"),
                 chicks = c(3, 0, 0, 0, 0, 2, 1, 3, 4, 1, 0))

我需要执行 2 个操作,这两个操作都以每个 groupID 每年的 Breed_attempt 为计算单位。

(a) 如何从数据中删除同一年和同一组 ID 中所有参与雌性都有 0 只雏鸡的所有繁殖尝试? (例如,breeding_attepmt 2,1999 年,需要删除组“Jon”)

(b) 如何计算每组每年的繁殖尝试百分比,其中 1 只雌性有 > 0 只雏鸡,而所有其他参与的雌性添加 0 只雏鸡? (即单个成功雌性的繁殖尝试、年份、组 ID 的百分比)。在这个样本中,它应该是 50%,因为组“jon”1999 1 和“Tina”2000 1 只有一名成功的女性。

理想情况下,我还可以获得一个总结原始数据的数据框。即,一个数据框,其中每行代表每个组 ID 每年的繁殖尝试,以及一列指示是否只有 1 只成功的雌性。

我尝试使用聚合函数,但我是 R 新手,并没有深入了解它......

谢谢!

r aggregate percentage
1个回答
0
投票

既然你似乎在寻找基本的 R 解决方案,这是我的:

# Question a
agg_a <- aggregate(chicks~groupID+breeding_attempt, data=df, sum)
subset(df, !(groupID %in% agg_a$groupID[agg_a$chicks==0] &
             breeding_attempt %in% agg_a$breeding_attempt[agg_a$chicks==0]))

# Question b
agg_b <- aggregate(chicks>0~groupID+year, data=df, sum)
sum(agg_b$`chicks > 0`==1)/nrow(agg_b)

我认为

agg_b
data.frame 提供了您也在寻找的摘要。

由于您是 R 新手并尝试使用

aggregate
,您可能不知道 R 中有一个名为 tidyverse 的框架,它具有特定的语法,并且通常与基础 R 相对立。对于初学者来说可能很难学习Base R 和 tidyverse 同时做事的方式,这就是为什么你现在可能想坚持使用 Base R。

© www.soinside.com 2019 - 2024. All rights reserved.