【问题标题】:R equivalent to Stata's bysort x y (z):R 等价于 Stata 的 bysort x y (z):
【发布时间】:2020-03-19 15:35:36
【问题描述】:

在 Stata 中,可以通过执行以下操作在组内运行命令并按xy 排序,并进一步按z 排序(但不能在分组中使用z):

bysort x y (z): command

如何在 R 中做到这一点,尤其是排序部分?

请注意,xyz 的排序很重要。

这是我认为可能是代码的一部分,使用tidyverse

data %>% group_by(x,y) %>% command

示例数据:

a <- data.frame(x=c(1,1,1,1,2,2,2,2), y=c(3,3,4,4,5,5,6,6), z=c(8,7,6,5,4,3,2,1), val=c(1,2,3,4,5,6,7,8))

在每个xy 组内,我想执行以下操作:

mutate(lag = lag(val))

【问题讨论】:

    标签: r sorting dplyr stata tidyverse


    【解决方案1】:

    简短的回答是,R 没有一个与 Stata sortby 等价的东西。这取决于sortby 之后的command。与 Stata 不同,R 在大多数情况下不需要对子组分析进行排序。
    在这种情况下,我们不需要按xy 进行排序。我不确定您的预期结果,但一种选择可能是这样的:

    a %>% 
      group_by(x, y) %>% 
      arrange(z) %>% 
      mutate(lag = lag(val)) %>%
      ungroup()
    
    # A tibble: 8 x 5
          x     y     z   val   lag
      <dbl> <dbl> <dbl> <dbl> <dbl>
    1     2     6     1     8    NA
    2     2     6     2     7     8
    3     2     5     3     6    NA
    4     2     5     4     5     6
    5     1     4     5     4    NA
    6     1     4     6     3     4
    7     1     3     7     2    NA
    8     1     3     8     1     2
    

    【讨论】:

    • 这不是按要求按 x 和 y 排序
    • 据我所知,问题是如何对所有 x、y、z 进行排序。该操作已显示用于计算组内滞后的正确代码...
    【解决方案2】:

    dplyr 中的 arrange 函数。如果您不想升序,请在其中使用desc。此外,group_by 的使用也不必为此目的 - 您指定列的顺序是行排序的优先级..

    data %>%
      arrange(x, y, desc(z))
    

    更新: 我想你已经知道如何做这部分了,因为我已经向你展示了如何排序......

    data %>%
      arrange(x, y, desc(z)) %>%
      group_by(x,y) %>%
      mutate(lagged = lag(z))
    

    【讨论】:

    • Arrange 会有所帮助,但确实需要按 x 和 y 分组。 stata 的 bysort 中的括号确保数据按 z 排序,但 z 不会包含在分组中。
    • group_by 究竟需要什么?不适用于 OP 提出的排序问题。只有当他需要在组内做其他事情时才需要它
    • 他需要为每个组生成一个滞后。如果您使用 group_by 会有所不同
    • 我看到他已经有代码了。我只是在解决排序问题
    【解决方案3】:

    对于您的(更新的?)数据和mutate() 命令的具体问题,您似乎已经在group_by()arrange()mutate() 的正确轨道上。

    但对于更广泛的问题,有一些拆分应用问题并不像在 Stata 中那样简单。这是一个汇总组的示例,它具有更明确的拆分应用形式。

    library(tidyverse)
    a <- data.frame(x = c(1, 1, 1, 1, 2, 2, 2, 2), y = c(3, 3, 4, 4, 5, 5, 6, 6), z = c(8, 7, 6, 5, 4, 3, 2, 1), val = c(1, 2, 3, 4, 5, 6, 7, 8))
    a %>%
      group_split(x, y) %>%
      purrr::map(summary)
    #> [[1]]
    #>        x           y           z             val      
    #>  Min.   :1   Min.   :3   Min.   :7.00   Min.   :1.00  
    #>  1st Qu.:1   1st Qu.:3   1st Qu.:7.25   1st Qu.:1.25  
    #>  Median :1   Median :3   Median :7.50   Median :1.50  
    #>  Mean   :1   Mean   :3   Mean   :7.50   Mean   :1.50  
    #>  3rd Qu.:1   3rd Qu.:3   3rd Qu.:7.75   3rd Qu.:1.75  
    #>  Max.   :1   Max.   :3   Max.   :8.00   Max.   :2.00  
    #> 
    #> [[2]]
    #>        x           y           z             val      
    #>  Min.   :1   Min.   :4   Min.   :5.00   Min.   :3.00  
    #>  1st Qu.:1   1st Qu.:4   1st Qu.:5.25   1st Qu.:3.25  
    #>  Median :1   Median :4   Median :5.50   Median :3.50  
    #>  Mean   :1   Mean   :4   Mean   :5.50   Mean   :3.50  
    #>  3rd Qu.:1   3rd Qu.:4   3rd Qu.:5.75   3rd Qu.:3.75  
    #>  Max.   :1   Max.   :4   Max.   :6.00   Max.   :4.00  
    #> 
    [...detail omitted...]
    

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 2021-04-23
      • 2021-05-01
      • 1970-01-01
      • 2022-01-18
      • 2014-11-27
      • 2013-02-26
      • 1970-01-01
      相关资源
      最近更新 更多