r - 计算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
解决方案
这是一个 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")
推荐阅读
- xml - 如何使用 Haskell 将 XML 作为对象读取并写入 MySQL
- jenkins - Jenkins声明性管道中的手动构建步骤?
- c# - 改变控制器 ASP.Net 5 中的文化
- javascript - RxJs 结合不同的并基于流执行不同的动作
- c# - 如何将并发队列转换为不可变队列
- macos - 如何在 Mac 上仅显示当前桌面中活动的应用程序
- javascript - Usercript access to Dynamically generated (Vaadin framework) content
- go - ioutils.WriteFile() 不尊重权限
- python - 将 ireg 转换为 XML
- xamarin.forms - Xamarin.Forms ScrollView ScrollToAsync 行为