【问题标题】:Searching for a straightforward way to do Stata's bysort tasks in R在 R 中寻找一种直接的方法来完成 Stata 的排序任务
【发布时间】:2014-10-06 06:35:22
【问题描述】:

我对 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 计算任何特定观察所属的每个组中有多少观察(即,category a 为 3,category b 为 4,category c 为 3 )

(4) var5 记录var1 中的每个观察值与它上面的观察值之间的差异

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

我对 Stata 相当熟悉,并且我发现使用 bysort 前缀命令完成以上所有操作并不难。例如,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

非常感谢您提前提出的任何建议。对不起菜鸟问题;我确信这在其他地方得到了回答,但是尽管搜索了几个小时,我还是找不到它。

【问题讨论】:

  • Meta-comment 作为一个有经验的 Stata 用户和一个非常偶然的 R 用户:我认为在 R 中做某事总是有一种聪明的方法,但没有规定它看起来像Stata 解决方案。
  • 在 Stata 中 bysort category: gen var1 = 1 if _n==1 不会产生 0 或 1 的指标变量(在您的术语中是虚拟的),但会产生缺失或 1 的指标。为此,您需要bysort category: gen var1 = _n==1

标签: r stata


【解决方案1】:

使用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))

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2011-03-09
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2022-07-08
      相关资源
      最近更新 更多