R等同于Stata的x y(z):

时间:2019-11-23 23:33:25

标签: r sorting dplyr stata tidyverse

在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))

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:2)

简短的答案是R没有与Stata sortby等效的单值。它取决于command之后的sortby。与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

答案 2 :(得分:1)

对于有关您的(更新的?)数据和mutate()命令的特定问题,似乎您在group_by()arrange()和{{1 }}。

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

mutate()