在特定年份的 R 中生成序列
Generating sequence in R for specific years
我想在我的数据中创建一个递减数年的计数器。
基本上,我有 2 个不同的事件日期,我想从第一个到第二个。我也有完全没有事故的遗漏案例。
在我下面非常糟糕的模拟数据中,a 组在 1995 年发生了事件 1,在 1999 年发生了事件 2。我希望在 1995 年有一个新的列,从 1995 年的 4 次、1996 年的 3 次、1997 年的 2 次和以此类推,直到 0. NAs 之前和之后。
我怎么做?
我玩过 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
编辑:添加结果,对遗漏的年份感到抱歉
您可以使用 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 - 如果是这样,我们从中减去 Var1
每行 inc2
。
我想在我的数据中创建一个递减数年的计数器。 基本上,我有 2 个不同的事件日期,我想从第一个到第二个。我也有完全没有事故的遗漏案例。
在我下面非常糟糕的模拟数据中,a 组在 1995 年发生了事件 1,在 1999 年发生了事件 2。我希望在 1995 年有一个新的列,从 1995 年的 4 次、1996 年的 3 次、1997 年的 2 次和以此类推,直到 0. NAs 之前和之后。 我怎么做? 我玩过 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
编辑:添加结果,对遗漏的年份感到抱歉
您可以使用 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 - 如果是这样,我们从中减去 Var1
每行 inc2
。