使用 R 中的嵌套行子集创建新列

芙蓉

我想根据数据框中已有的列在数据框中创建 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()会特别有帮助。

arg0naut91

能做:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Data.Table R中的按行操作创建新列

来自分类Dev

使用 R 从创建新列的行中提取数据

来自分类Dev

使用seq子集r中的奇数行

来自分类Dev

使用seq子集r中的奇数行

来自分类Dev

无法使用R中的函数创建新列

来自分类Dev

使用类似的模式在R中创建新列

来自分类Dev

使用R,如何使用if创建新列?

来自分类Dev

使用R中的命名向量按列和行对表进行子集

来自分类Dev

如何使用R创建新的ID列

来自分类Dev

如何使用R创建新的ID列

来自分类Dev

使用子集在 R 中创建交叉表

来自分类Dev

将小标题扩展为行,并使用R根据行创建新列

来自分类Dev

使用R中现有列中的数据创建新列

来自分类Dev

r中的data.table:使用列索引的子集

来自分类Dev

R:划分不同的行并使用其值创建一个新的列

来自分类Dev

R:使用lapply创建新的列和值并应用嵌套在data.frame列表上的输出错误

来自分类Dev

使用R中的模式匹配从现有列创建新列

来自分类Dev

R dataframe使用/ / all_of / mutate_if从现有列中创建多个新列

来自分类Dev

使用数据子集时如何在data.table中创建新列并计算中位数

来自分类Dev

如何根据r中的条件使用选定的行创建新的df?

来自分类Dev

R:根据当前行的值对行的子集求和并添加到新列中

来自分类Dev

R Shiny-如何使用列2中的嵌套行生成此布局

来自分类Dev

R Shiny-如何使用列2中的嵌套行生成此布局

来自分类Dev

使用R中的列创建时间间隔

来自分类Dev

如何使用if else语句基于str值在r数据框中创建新列?

来自分类Dev

使用列表在数据框中快速创建新列-R

来自分类Dev

R data.table:如何使用字符串中的名称创建新列?

来自分类Dev

使用函数和变异在 R 中创建一个新列

来自分类Dev

查询R中组的特定行以创建新列

Related 相关文章

  1. 1

    使用Data.Table R中的按行操作创建新列

  2. 2

    使用 R 从创建新列的行中提取数据

  3. 3

    使用seq子集r中的奇数行

  4. 4

    使用seq子集r中的奇数行

  5. 5

    无法使用R中的函数创建新列

  6. 6

    使用类似的模式在R中创建新列

  7. 7

    使用R,如何使用if创建新列?

  8. 8

    使用R中的命名向量按列和行对表进行子集

  9. 9

    如何使用R创建新的ID列

  10. 10

    如何使用R创建新的ID列

  11. 11

    使用子集在 R 中创建交叉表

  12. 12

    将小标题扩展为行,并使用R根据行创建新列

  13. 13

    使用R中现有列中的数据创建新列

  14. 14

    r中的data.table:使用列索引的子集

  15. 15

    R:划分不同的行并使用其值创建一个新的列

  16. 16

    R:使用lapply创建新的列和值并应用嵌套在data.frame列表上的输出错误

  17. 17

    使用R中的模式匹配从现有列创建新列

  18. 18

    R dataframe使用/ / all_of / mutate_if从现有列中创建多个新列

  19. 19

    使用数据子集时如何在data.table中创建新列并计算中位数

  20. 20

    如何根据r中的条件使用选定的行创建新的df?

  21. 21

    R:根据当前行的值对行的子集求和并添加到新列中

  22. 22

    R Shiny-如何使用列2中的嵌套行生成此布局

  23. 23

    R Shiny-如何使用列2中的嵌套行生成此布局

  24. 24

    使用R中的列创建时间间隔

  25. 25

    如何使用if else语句基于str值在r数据框中创建新列?

  26. 26

    使用列表在数据框中快速创建新列-R

  27. 27

    R data.table:如何使用字符串中的名称创建新列?

  28. 28

    使用函数和变异在 R 中创建一个新列

  29. 29

    查询R中组的特定行以创建新列

热门标签

归档