【问题标题】:Generating sequence in R for specific years在 R 中生成特定年份的序列
【发布时间】:2020-11-18 10:36:57
【问题描述】:

我想在我的数据中创建一个递减数年的计数器。 基本上,我有 2 个不同的事件日期,我想从第一个到第二个。我也有一些完全没有事故的失踪案例。

在下面我非常糟糕的模拟数据中,a 组在 1995 年有事件 1,在 1999 年有事件 2。我希望在 1995 年有一个新列从 1995 年的 4、1996 年的 3、1997 年的 2 倒数,依此类推直到 0。在那之前和之后的 NA。 我怎么做? 我玩过 seq,但似乎无法做到。

year <- seq(from = 1990, to=2000)
id <- letters[seq( from = 1, to = 3 )]
df <- data.frame( expand.grid(year, id))
df$inc1[df$Var2 == "a"] <- 1995
df$inc1[df$Var2 == "b"] <- 1992
df$inc2[df$Var2 == "a"] <- 1999
df$inc2[df$Var2 == "b"] <- 1997

想要的结果是这样的


   Var1 Var2 toa1 toa2 diff
1  1990    a 1995 1999 NA
2  1991    a 1995 1999 NA
3  1992    a 1995 1999 NA
4  1993    a 1995 1999 NA
5  1994    a 1995 1999 NA
6  1995    a 1995 1999 4
7  1996    a 1995 1999 3
8  1997    a 1995 1999 2
9  1998    a 1995 1999 1
10 1999    a 1995 1999 0
11 2000    a 1995 1999 NA
12 1990    b 1992 1997 NA
13 1991    b 1992 1997 NA
14 1992    b 1992 1997 5
15 1993    b 1992 1997 4
16 1994    b 1992 1997 3
17 1995    b 1992 1997 2
18 1996    b 1992 1997 1
19 1997    b 1992 1997 0
20 1998    b 1992 1997 NA
21 1999    b 1992 1997 NA
22 2000    b 1992 1997 NA
23 1990    c   NA   NA NA
24 1991    c   NA   NA NA
25 1992    c   NA   NA NA
26 1993    c   NA   NA NA
27 1994    c   NA   NA NA
28 1995    c   NA   NA NA
29 1996    c   NA   NA NA
30 1997    c   NA   NA NA
31 1998    c   NA   NA NA
32 1999    c   NA   NA NA
33 2000    c   NA   NA NA

编辑:添加结果,对丢失的年份感到抱歉

【问题讨论】:

  • 能否也提供给我们year-object?最好向我们展示我们想要的结果,而不是描述它。

标签: r countdown data-wrangling


【解决方案1】:

您可以结合使用dplyr 包中的rowwise()case_when() 来处理复杂的条件:

year <- seq(from = 1990, to=2000)
id <- letters[seq( from = 1, to = 3 )]
df <- data.frame( expand.grid(year, id))
df$inc1[df$Var2 == "a"] <- 1995
df$inc1[df$Var2 == "b"] <- 1992
df$inc2[df$Var2 == "a"] <- 1999
df$inc2[df$Var2 == "b"] <- 1997

## ------------------------------------------------------------------------

library(dplyr)

result <- df %>% 
  rowwise() %>% 
  mutate(diff = case_when(
    
    Var1 >= inc1 & Var1 <= inc2 ~ inc2 - Var1
    
  ))

print.data.frame(result)
#>    Var1 Var2 inc1 inc2 diff
#> 1  1990    a 1995 1999   NA
#> 2  1991    a 1995 1999   NA
#> 3  1992    a 1995 1999   NA
#> 4  1993    a 1995 1999   NA
#> 5  1994    a 1995 1999   NA
#> 6  1995    a 1995 1999    4
#> 7  1996    a 1995 1999    3
#> 8  1997    a 1995 1999    2
#> 9  1998    a 1995 1999    1
#> 10 1999    a 1995 1999    0
#> 11 2000    a 1995 1999   NA
#> 12 1990    b 1992 1997   NA
#> 13 1991    b 1992 1997   NA
#> 14 1992    b 1992 1997    5
#> 15 1993    b 1992 1997    4
#> 16 1994    b 1992 1997    3
#> 17 1995    b 1992 1997    2
#> 18 1996    b 1992 1997    1
#> 19 1997    b 1992 1997    0
#> 20 1998    b 1992 1997   NA
#> 21 1999    b 1992 1997   NA
#> 22 2000    b 1992 1997   NA
#> 23 1990    c   NA   NA   NA
#> 24 1991    c   NA   NA   NA
#> 25 1992    c   NA   NA   NA
#> 26 1993    c   NA   NA   NA
#> 27 1994    c   NA   NA   NA
#> 28 1995    c   NA   NA   NA
#> 29 1996    c   NA   NA   NA
#> 30 1997    c   NA   NA   NA
#> 31 1998    c   NA   NA   NA
#> 32 1999    c   NA   NA   NA
#> 33 2000    c   NA   NA   NA

reprex package (v0.3.0) 于 2020 年 11 月 18 日创建

rowwise() 确保计算是按行完成的,而不是在整个列上进行矢量化。在case_when 语句中,我们检查Var1 是否大于或等于inc1 且小于或等于inc2 - 如果是这种情况,我们在每一行中从inc2 中减去Var1

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    相关资源
    最近更新 更多