寻找在R中执行Stata的By Sort任务的直接方法 [英] Searching for a straightforward way to do Stata's bysort tasks in R

查看:23
本文介绍了寻找在R中执行Stata的By Sort任务的直接方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对R非常陌生,几天来一直在努力做一些Stata非常直截了当的事情。一位朋友给了我一个相对复杂的答案,但我想知道是否有简单的方法来做下面的事情。

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

category    var1 
a            1     
a            2    
a            3     
b            4     
b            6  
b            8   
b           10    
c           11     
c           14      
c           17

我想生成另外五个变量,每个变量都应该插入到这个相同的数据帧中:var2var3var4var5var6

(1)var2是一个虚拟变量,对于每个类别(即,category定义的三个组中的每一个)中的第一个观测,它的值为1,否则为0。

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

(3)var4统计任何特定观测所属的每个组中有多少个观测(即,categorya为SO3,categoryb为4,categoryc为3)

(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

非常感谢您提前提出任何建议。对于菜鸟的问题,我很抱歉;我相信这个问题已经在其他地方得到了答案,但我找了好几个小时也没能找到它。

推荐答案

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

这篇关于寻找在R中执行Stata的By Sort任务的直接方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆