我想根据数据框中已有的列在数据框中创建 2 个新列。我dplyr
经常使用,因为仍然在为嵌套案例重新编码而苦苦挣扎,特别是当案例不是二进制时。
现有数据框有一个时间序列(用于索引观察)、一组 1:3 的状态,以及每个 a == 2 的因子:
time <- seq(as.POSIXlt(Sys.time(), "GMT"), by="min", length.out = 25)
a <- c(rep(1,10),rep(2,5),rep(3,6),rep(2,4))
b <- c(rep(NA,10),rep("LAND",3),rep("WATER",2),rep(NA,6),rep("LAND",4))
data <- data.frame(time,a,b)
time a b
1 2019-02-12 23:18:36 1 <NA>
2 2019-02-12 23:19:36 1 <NA>
3 2019-02-12 23:20:36 1 <NA>
4 2019-02-12 23:21:36 1 <NA>
5 2019-02-12 23:22:36 1 <NA>
6 2019-02-12 23:23:36 1 <NA>
7 2019-02-12 23:24:36 1 <NA>
8 2019-02-12 23:25:36 1 <NA>
9 2019-02-12 23:26:36 1 <NA>
10 2019-02-12 23:27:36 1 <NA>
11 2019-02-12 23:28:36 2 LAND
12 2019-02-12 23:29:36 2 LAND
13 2019-02-12 23:30:36 2 LAND
14 2019-02-12 23:31:36 2 WATER
15 2019-02-12 23:32:36 2 WATER
16 2019-02-12 23:33:36 3 <NA>
17 2019-02-12 23:34:36 3 <NA>
18 2019-02-12 23:35:36 3 <NA>
19 2019-02-12 23:36:36 3 <NA>
20 2019-02-12 23:37:36 3 <NA>
21 2019-02-12 23:38:36 3 <NA>
22 2019-02-12 23:39:36 2 LAND
23 2019-02-12 23:40:36 2 LAND
24 2019-02-12 23:41:36 2 LAND
25 2019-02-12 23:42:36 2 LAND
我想(1)对每一行(“事件”)的事件编号进行排序,这样 a == 2 的连续序列就是一个事件,并且(2)在每个事件中创建一个新列(“事件类型”),例如那:
如果事件中的所有 b 都相同(例如,所有行都是“LAND”或“WATER”),则代码为“LAND”或“WATER”;
但如果事件包括“陆地”和“水”观测,则为“混合”。
生成的 df 将如下所示:
time a b event eventtype
1 2019-02-12 22:51:31 1 <NA> NA <NA>
2 2019-02-12 22:52:31 1 <NA> NA <NA>
3 2019-02-12 22:53:31 1 <NA> NA <NA>
4 2019-02-12 22:54:31 1 <NA> NA <NA>
5 2019-02-12 22:55:31 1 <NA> NA <NA>
6 2019-02-12 22:56:31 1 <NA> NA <NA>
7 2019-02-12 22:57:31 1 <NA> NA <NA>
8 2019-02-12 22:58:31 1 <NA> NA <NA>
9 2019-02-12 22:59:31 1 <NA> NA <NA>
10 2019-02-12 23:00:31 1 <NA> NA <NA>
11 2019-02-12 23:01:31 2 LAND 1 MIXED
12 2019-02-12 23:02:31 2 LAND 1 MIXED
13 2019-02-12 23:03:31 2 LAND 1 MIXED
14 2019-02-12 23:04:31 2 WATER 1 MIXED
15 2019-02-12 23:05:31 2 WATER 1 MIXED
16 2019-02-12 23:06:31 3 <NA> NA <NA>
17 2019-02-12 23:07:31 3 <NA> NA <NA>
18 2019-02-12 23:08:31 3 <NA> NA <NA>
19 2019-02-12 23:09:31 3 <NA> NA <NA>
20 2019-02-12 23:10:31 3 <NA> NA <NA>
21 2019-02-12 23:11:31 3 <NA> NA <NA>
22 2019-02-12 23:12:31 2 LAND 2 LAND
23 2019-02-12 23:13:31 2 LAND 2 LAND
24 2019-02-12 23:14:31 2 LAND 2 LAND
25 2019-02-12 23:15:31 2 LAND 2 LAND
使用dplyr::mutate()
or的答案case_when()
会特别有帮助。
能做:
library(dplyr)
data %>%
group_by(a) %>%
mutate(rn = row_number()) %>%
group_by(a, b) %>%
mutate(rn = as.integer(rn != lag(rn) + 1),
event = ifelse(is.na(b), NA, cumsum(replace(rn, is.na(rn), 0)) + 1)) %>%
group_by(a, event) %>%
mutate(eventtype = ifelse(n_distinct(b) > 1, "MIXED", as.character(b))) %>%
select(-rn)
输出:
time a b event eventtype
1 2019-02-12 23:31:48 1 <NA> NA <NA>
2 2019-02-12 23:32:48 1 <NA> NA <NA>
3 2019-02-12 23:33:48 1 <NA> NA <NA>
4 2019-02-12 23:34:48 1 <NA> NA <NA>
5 2019-02-12 23:35:48 1 <NA> NA <NA>
6 2019-02-12 23:36:48 1 <NA> NA <NA>
7 2019-02-12 23:37:48 1 <NA> NA <NA>
8 2019-02-12 23:38:48 1 <NA> NA <NA>
9 2019-02-12 23:39:48 1 <NA> NA <NA>
10 2019-02-12 23:40:48 1 <NA> NA <NA>
11 2019-02-12 23:41:48 2 LAND 1 MIXED
12 2019-02-12 23:42:48 2 LAND 1 MIXED
13 2019-02-12 23:43:48 2 LAND 1 MIXED
14 2019-02-12 23:44:48 2 WATER 1 MIXED
15 2019-02-12 23:45:48 2 WATER 1 MIXED
16 2019-02-12 23:46:48 3 <NA> NA <NA>
17 2019-02-12 23:47:48 3 <NA> NA <NA>
18 2019-02-12 23:48:48 3 <NA> NA <NA>
19 2019-02-12 23:49:48 3 <NA> NA <NA>
20 2019-02-12 23:50:48 3 <NA> NA <NA>
21 2019-02-12 23:51:48 3 <NA> NA <NA>
22 2019-02-12 23:52:48 2 LAND 2 LAND
23 2019-02-12 23:53:48 2 LAND 2 LAND
24 2019-02-12 23:54:48 2 LAND 2 LAND
25 2019-02-12 23:55:48 2 LAND 2 LAND
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句