首页 > 解决方案 > 计算R中连续类别变化的时间条纹数

问题描述

我在 R 中有以下数据框:

Row number   A   B   C   D   E   F   G   H   I   J
1                1   1   0   0   1   0   0   1   1
2                    1   0   0   0   1   0   0   1
3                1   0   0   0   1   0   0   1   1

我正在尝试计算数字在 1 和 0 之间变化的次数,不包括 Null

我期待的结果是这样的

Row Number    No of changes
----------    --------------
1                4
2                4
3                4

第 1 行的解释

在第 1 行中,A 有一个空值,因此我们将其排除在外。

B 和 C 有 1,这是我们的第一组值。

D 和 E 的值为 0,这是我们的第二组值。现在改变= 1

F 有我们的第三组值,即 1。现在Change = 1+1

G 和 H 的值为 0,这是我们的第三组值。现在改变= 1+1+1

I 和 J 有 1,这是我们的第四组值。现在改变= 1+1+1+1 =4

标签: r

解决方案


这是一个 tidyverse 方法。我收集到更长的格式(从tidyr::pivot_longer),然后添加一个帮助列,注意我们何时从 0 更改为 1 或从 1 更改为 0,然后按行求和。

library(tidyverse)            
df %>%
  # before tidyr 1.0, this would be   gather(col, value, -1)
  pivot_longer(-1, "col") %>%
  group_by(Row.number) %>%
  mutate(chg = value == 1 & lag(value) == 0 |
           value == 0 & lag(value) == 1) %>%
  summarize(no_chgs = sum(chg, na.rm = T))


# A tibble: 3 x 2
  Row.number no_chgs
       <int>   <int>
1          1       4
2          2       4
3          3       4

样本数据:

df <- read.table(
  header = T, 
  stringsAsFactors = F,
  text = "'Row number'   A   B   C   D   E   F   G   H   I   J
            1            NA  1   1   0   0   1   0   0   1   1
            2            NA  NA  1   0   0   0   1   0   0   1
            3            NA  1   0   0   0   1   0   0   1   1")

推荐阅读