寻找一种直接的方法来在R中执行Stata的bysort任务

daa*_*noo 10 r stata

我对R很陌生,并且已经挣扎了几天来做一些Stata非常简单的事情.朋友给了我一个相对复杂的答案来回答这个问题,但我想知道是否有一个简单的方法可以做到以下几点.

假设我有一个两个变量数据帧,组织如下:

category    var1 
a            1     
a            2    
a            3     
b            4     
b            6  
b            8   
b           10    
c           11     
c           14      
c           17
Run Code Online (Sandbox Code Playgroud)

我要生成另外五个变量,每个应插入此相同的数据帧:var2,var3,var4,var5,和var6

(1)var2是一个虚拟变量,它取每个类别中第一次观察的值1(即,由三个组定义的每一个category),否则为0.

(2)var3是一个虚拟变量,它取每个类别中最后一次观察的值1,否则为0.

(3)var4计算任何特定观察所属的每组中的观察数量(即,3为categorya,4为categoryb,3为categoryc)

(4)var5记录每次观察var1与其上方观察的差异

(5)var6记录每次观察var1与其上方观察之间的差异,但仅限于由其定义的组内category.

我对Stata非常熟悉,我发现使用bysortprefix命令并不难做到.例如,var1很容易生成bysort category: gen var1=1 if _n==1.但是我在最后一天试图弄清楚如何使用R来解决它们.我确信有几种解决方案(我的朋友参与了ddplyr包装,这似乎比我的工资高出一步).没有什么比这更容易了bysort吗?

最终数据集应如下所示:

category    var1     var2     var3     var4     var5    var6   
a            1        1        0        3       n/a      n/a
a            2        0        0        3        1        1
a            3        0        1        3        1        1
b            4        1        0        4        1       n/a
b            6        0        0        4        2        2
b            8        0        0        4        2        2
b           10        0        1        4        2        2
c           11        1        0        3        1       n/a
c           14        0        0        3        3        3
c           17        0        1        3        3        3
Run Code Online (Sandbox Code Playgroud)

非常感谢任何建议,提前.抱歉新手问题; 我确信在其他地方已经得到了回答,但是尽管经过了数小时的搜索,我还是找不到它.

raw*_*awr 10

dat <- read.table(header = TRUE, 
           text = 
'category    var1 
a            1     
a            2    
a            3     
b            4     
b            6  
b            8   
b           10    
c           11     
c           14      
c           17')


(dat <- within(dat, {
  var6 <- ave(var1, category, FUN = function(x) c(NA, diff(x)))
  var5 <- c(NA, diff(var1))
  var4 <- ave(var1, category, FUN = length)
  var3 <- rev(!duplicated(rev(category))) * 1
  var2 <- (!duplicated(category)) * 1
}))

#    category var1 var2 var3 var4 var5 var6
# 1         a    1    1    0    3   NA   NA
# 2         a    2    0    0    3    1    1
# 3         a    3    0    1    3    1    1
# 4         b    4    1    0    4    1   NA
# 5         b    6    0    0    4    2    2
# 6         b    8    0    0    4    2    2
# 7         b   10    0    1    4    2    2
# 8         c   11    1    0    3    1   NA
# 9         c   14    0    0    3    3    3
# 10        c   17    0    1    3    3    3
Run Code Online (Sandbox Code Playgroud)


Mat*_*hew 8

答案使用 dplyr

library(dplyr)
dat <- dat %>%
 group_by(category) %>%
 mutate(var2 = ifelse(row_number() == 1, 1, 0))%>%
 mutate(var3 = ifelse(row_number() == n(), 1, 0)) %>%
 mutate(var4 = n()) %>%
 mutate(var6 = lag(var1, 1)) %>%
 ungroup() %>%
 mutate(var5 = lag(var1, 1))
Run Code Online (Sandbox Code Playgroud)