首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于R中的事件创建条件时间线

基于R中的事件创建条件时间线
EN

Stack Overflow用户
提问于 2018-05-02 05:00:57
回答 2查看 93关注 0票数 3

我有数据,其中‘法律’变量在不同的地方(‘地方’)指示立法的变化:

代码语言:javascript
运行
复制
Person  Place  Year  Law
1         A    1990   0
2         A    1991   1
3         A    1992   1
4         B    1990   0
5         B    1991   0
6         B    1992   1
7         B    1993   1
8         B    1993   1
9         B    1993   1
10        B    1992   1

基本上,该法律于1991年在A地实施,并在随后的所有时间段内继续有效。它于1992年在B地实施,并一直有效,等等。

我想创建一个新变量,该变量在法律实施的年份取值为0,1表示法律实施后1年,2表示法律实施后2年,-1表示前一年,-2表示前2年,依此类推。

我需要最终的数据帧看起来像这样:

代码语言:javascript
运行
复制
Person  Place  Year  Law  timeline 
1         A    1990   0     -1
2         A    1991   1      0
3         A    1992   1      1
4         B    1990   0     -2
5         B    1991   0     -1
6         B    1992   1      0
7         B    1993   1      1
8         B    1993   1      2
9         B    1993   1      2
10        B    1992   1      1

我试过了:

代码语言:javascript
运行
复制
library(dplyr)
df %>% 
 group_by(Place) %>%
 arrange(Year) %>%
 mutate(timeline = rank(Law))

但它并不像我需要的那样工作。我做错了什么?我能在dplyr中做到这一点吗?或者我需要创建一个复杂的for循环吗?

EN

回答 2

Stack Overflow用户

发布于 2018-05-02 05:12:48

您可以通过实现Law的索引来减去row_numer

代码语言:javascript
运行
复制
df %>% 
    arrange(Year) %>% 
    group_by(Place) %>% 
    mutate(timeline = row_number() - which(diff(Law) == 1) - 1) %>% 
    arrange(Place)

# A tibble: 7 x 5
# Groups:   Place [2]
#  Person Place  Year   Law timeline
#   <int> <fct> <int> <int>    <dbl>
#1      1 A      1990     0      -1.
#2      2 A      1991     1       0.
#3      3 A      1992     1       1.
#4      4 B      1990     0      -2.
#5      5 B      1991     0      -1.
#6      6 B      1992     1       0.
#7      7 B      1993     1       1.
票数 1
EN

Stack Overflow用户

发布于 2018-05-02 05:46:29

使用data.table

代码语言:javascript
运行
复制
library(data.table)
setDT(dat)[,timeline:=sequence(.N)-which.min(!Law),by=Place]
dat
   Person Place Year Law timeline
1:      1     A 1990   0       -1
2:      2     A 1991   1        0
3:      3     A 1992   1        1
4:      4     B 1990   0       -2
5:      5     B 1991   0       -1
6:      6     B 1992   1        0
7:      7     B 1993   1        1

使用基数r:

代码语言:javascript
运行
复制
transform(dat,timeline=ave(Law,Place,FUN=function(x)1:length(x)-which.min(!x)))
  Person Place Year Law timeline
1      1     A 1990   0       -1
2      2     A 1991   1        0
3      3     A 1992   1        1
4      4     B 1990   0       -2
5      5     B 1991   0       -1
6      6     B 1992   1        0
7      7     B 1993   1        1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50123773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档