我有以下数据框:

df <- read.table(text = "group  age status
A   25  yes
A   32  no
A   58  yes
A   78  no
A   76  yes
B   21  no
B   71  yes
B   43  no
B   48  no
C   39  no
C   82  yes
C   87  no
C   91  yes", header = T)

我想要GROUP_BY GROUP列,然后以这样一种方式进行汇总:如果年龄小于50且状态为"yes",则计算这些值,然后计算年龄小于50的值的总数. 因此,对于数据框中的‘A’:

age_lt_50_yes = 1
age_lt_50 = 2

同样,对于年龄大于50岁的人,如果是,然后年龄大于50岁; 对于‘A’;这将是:

age_gt_50_yes = 2
age_gt_50 = 3

我实际上希望AGE_lt_50_yes/age_lt_50的比率为1/2,A的AGE_GT_50_YES/AGE_GT_50=2/3

如果不管怎样,我遇到了这样一种情况,我有这样的0/0;那么我只想要0作为输出.

如何使用dplyr执行此操作?

以下是我try 过的:

df %>% 
  group_by(group) %>% 
  summarize(age_le50_prop = sum(age <= 50) / n(),
            age_gt50_prop = sum(age > 50) / n())

我需要在汇总函数中添加状态

我的输出应该如下所示:

group_by age_lt_50  age_gr_50
A   0.5 0.66
B   0   1
C   0   0.66

推荐答案

您可以使用reframe(),并简单地定义所需的计数.最后一行将处理您有0/0的情况

reframe(
  df, 
  age_lt_50 = sum(age<50 & status=="yes")/sum(age<50),
  age_gt_50 = sum(age>=50 & status=="yes")/sum(age>=50),
  .by=group) %>% replace(is.na(.),0)

输出:

  group age_lt_50 age_gt_50
1     A       0.5 0.6666667
2     B       0.0 1.0000000
3     C       0.0 0.6666667

下面是一种替代方法,它演示了使用summarize()而不是重新定格,并且(独立地)还演示了另一种判断分母中是否可能为0的方法:

df %>% 
  group_by(group) %>% 
  summarize(
    age_lt_50 = {if(sum(age<50)==0) 0 else sum(age<50 & status=="yes")/sum(age<50)},
    age_gt_50 = {if(sum(age>=50)==0) 0 else sum(age>=50 & status=="yes")/sum(age>=50)}
)

R相关问答推荐

如何在ggplot图中找到第二轴的比例

使用data.table::fcase()而不是dplyr::case_When()时保持值

使用带有OR条件的grepl过滤字符串

从多面条形图中删除可变部分

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

使用dqur在不同变量上创建具有多个条件的变量

如何在矩阵图中按标准对数据进行分组以绘制矩阵

在不带max()的data.table中按组查找最后一个元素

从单个html段落中提取键-值对

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值

使用nls()函数的非线性模型的半正态图

如何根据顺序/序列从数据框中排除值

如何使用包含要子集的值的列表或数据框来子集多个列?

根据小时-分钟列创建年-月-日序列

为各个小节生成单独的选项卡

以R表示的分组和计数日期

Pairwise_t_test()不返回统计数据和估计

删除多列中带有NA的行

通过DT包中shiny 的DataTable保存对react 性数据帧所做的更改

R:使用For-Loop创建新列