在Stata中,可以在组内运行命令,并按x
和y
排序,再按z
排序(但不能在分组中使用z
)通过执行以下操作:
bysort x y (z): command
如何在 R 中做到这一点,尤其是排序部分?
请注意,按x
,y
和z
进行排序很重要。
使用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))
在每个x
,y
组中,我想执行以下操作:
mutate(lag = lag(val))
答案 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在大多数情况下都不需要对子组分析进行排序。
在这种情况下,我们不需要按x
和y
进行排序。我不确定您的预期结果如何,但是一种选择可能是这样的:
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()