Group_by,条件求和并替换R中的变量

Posted

技术标签:

【中文标题】Group_by,条件求和并替换R中的变量【英文标题】:Group_by, conditional sum and replace the variables in R 【发布时间】:2022-01-17 17:25:40 【问题描述】:

我想将这两行从 Stata 转换成 R 代码:

bysort  sj hid: generate H = sum( d ) if f == 1 & ( d == 1 | d == 2 ) 
bysort  sj hid: replace  H = H[ _N ]  if f == 1 & ( d == 1 | d == 2 ) 

据我了解,结果应如下所示:

sj hid f d H
2000 27 0 1 0
2000 60 1 1 1
2000 302 1 1 3
2000 302 1 2 3
2000 302 1 3 0

我用过

H = ifelse(f==1 & (d==1 | d==2), ave(d,sj,hid, FUN = sum),0),

但是,我得到了这个结果:

sj hid f d H
2000 27 0 1 0
2000 60 1 1 1
2000 302 1 1 6
2000 302 1 2 6
2000 302 1 3 0

我想知道如何更改我在 R 中的代码以在 hid 302 中获得 H=3 而不是 6。 另外,我想知道我应该如何编写 R 代码来获得第二步,这给了我以下结果:

sj hid f d H
2000 27 0 1 0
2000 60 1 1 1
2000 302 1 1 3
2000 302 1 2 3
2000 302 1 3 0

有类似这样的代码吗?这个不行:

test_H %>%
    group_by(sj, hid) %>%
    if (f==1 & (d==1 | d==2))
       H = replace(test_H,H,[_N])
       

【问题讨论】:

FWIW,Stata 单线是bysort sj hid : egen H = total(cond(f == 1 & (d == 1 | d == 2), d, 0)),其中cond() 相当于ifelse() 欢迎来到 ***。这不是一个代码翻译网站。但是请尝试类似library(tidyverse); test_H %>% mutate(H = case_when(f == 1 & d %in% c(1,2) ~ H[n()], TRUE ~ H)) 的方法。 Mutate 用于在使用 tidyverse 时转换列,case_when 基本上是 tidyverse 术语中的“if else”。或者test_H %>% group_by(sj, hid) %>% mutate(H = case_when(f == 1 & d %in% c(1, 2) ~ last(H), TRUE ~ H),如果我们需要通过sjhid 列(也展示last 函数)进行摸索。 我不明白你的stata代码中第一行的需要。看,我不是 R 专家,所以我不知道任何一个班轮,但我认为你可以通过创建一个数据框来实现这一点,计算在 sjhid 级别(group_by()),然后加入结果到源数据框。 stata代码中的第二行基本上是在数d sum() 在 Stata 中产生累积或运行总和,因此原始 Stata 代码计算不同组的此类累积总和,然后查看每组的最后一次观察以查看每个总和或总和。如前所述,您不必那样做。 @NickCox 感谢您的贡献!我也是这样理解的。但是,如果 H 仅使用 d=1 或 2 或包括 d=3(第一个表或第二个表)计算总和,那么在 stata 中让我感到困惑的是? 【参考方案1】:

感谢以上所有答案。我发现这很有帮助。

How to sum variables in groups by condition with ave()?

它给了我现在想要的结果。

H=ifelse(f==1 & (d==1|d==2),ave(d*(d==1|d==2),sj,hid,FUN = sum),0)

【讨论】:

以上是关于Group_by,条件求和并替换R中的变量的主要内容,如果未能解决你的问题,请参考以下文章

条件求和 (R)

如何根据多个条件对行求和 - R? [复制]

R中数据帧的条件求和

Excel表格如何单条件求和

excel按条件求和 excel按条件求和具体步骤

如何把EXCEL表中的数据进行按多个条件进行分类汇总,并统计出个数,并求和?