【发布时间】: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()。 -
欢迎来到 Stackoverflow。这不是一个代码翻译网站。但是请尝试类似
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),如果我们需要通过sj和hid列(也展示last函数)进行摸索。 -
我不明白你的stata代码中第一行的需要。看,我不是 R 专家,所以我不知道任何一个班轮,但我认为你可以通过创建一个数据框来实现这一点,计算在
sj和hid级别(group_by()),然后加入结果到源数据框。 stata代码中的第二行基本上是在数d。 -
sum()在 Stata 中产生累积或运行总和,因此原始 Stata 代码计算不同组的此类累积总和,然后查看每组的最后一次观察以查看每个总和或总和。如前所述,您不必那样做。 -
@NickCox 感谢您的贡献!我也是这样理解的。但是,如果 H 仅使用 d=1 或 2 或包括 d=3(第一个表或第二个表)计算总和,那么在 stata 中让我感到困惑的是?
标签: r replace group-by conditional-statements stata