r - 基于跨行字符序列的子集数据
问题描述
如何通过连续字符行的模式对 df 进行子集化?在下面的示例中,我想对历史值连续为“TRUE”、“FALSE”、“TRUE”的数据进行子集化。下面的数据有点奇怪,但你明白了!
value <- c(1/1/16,1/2/16, 1/3/16, 1/4/16, 1/5/16, 1/6/16, 1/7/16, 1/8/16, 1/9/16, 1/10/16)
history <- c("TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "FALSE", "TRUE")
df <- data.frame(value, history)
df
value history
1 0.062500000 TRUE
2 0.031250000 FALSE
3 0.020833333 TRUE
4 0.015625000 TRUE
5 0.012500000 FALSE
6 0.010416667 TRUE
7 0.008928571 TRUE
8 0.007812500 TRUE
9 0.006944444 FALSE
10 0.006250000 TRUE
我试过grepl
了,但这适用于字符串 - 而不是跨行连续的字符序列。
输出将与上面的 df 相同,但没有第 7 行,因为它不遵循上述模式。
解决方案
你可以做...
s = c("TRUE", "FALSE", "TRUE")
library(data.table)
w = as.data.table(embed(history, length(s)))[as.list(s), on=paste0("V", seq_along(s)), which=TRUE]
df$v <- FALSE
df$v[w + rep(seq_along(s)-1L, each=length(s))] <- TRUE
value history v
1 0.062500000 TRUE TRUE
2 0.031250000 FALSE TRUE
3 0.020833333 TRUE TRUE
4 0.015625000 TRUE TRUE
5 0.012500000 FALSE TRUE
6 0.010416667 TRUE TRUE
7 0.008928571 TRUE FALSE
8 0.007812500 TRUE TRUE
9 0.006944444 FALSE TRUE
10 0.006250000 TRUE TRUE
然后,您可以过滤喜欢subset(df, v == TRUE)
.
这使用 data.table 连接工作,x[i, which=TRUE]
它查找i = as.list(s)
并x = embed(history, length(s))
报告x
匹配的行:
> as.data.table(as.list(s))
V1 V2 V3
1: TRUE FALSE TRUE
> as.data.table(embed(history, length(s)))
V1 V2 V3
1: TRUE FALSE TRUE
2: TRUE TRUE FALSE
3: FALSE TRUE TRUE
4: TRUE FALSE TRUE
5: TRUE TRUE FALSE
6: TRUE TRUE TRUE
7: FALSE TRUE TRUE
8: TRUE FALSE TRUE
w + rep(...)
与@GGrothendieck 的相同,只是outer(...)
这里w
包含比赛开始的位置,而不是结束的位置。
推荐阅读
- python - 从 wscript 运行 python 脚本无法激活 conda
- maven-release-plugin - 在 Maven 发布插件 3.0.0 阶段添加自定义执行
- json - 如何以指定格式将外部 json 文件中的数据保存到新的 json 文件中?
- r - 如何从 R 中的数据帧中提取数据帧的名称?
- ssl - 验证 ActiveDomain 是否具有由第三方机构签署的证书
- python - Discord - 使用 python 显示来自特定类别的频道名称
- r - 选择结果分析中的第一个日期
- rename - 如何通过 youtube-dl 重命名下载的 youtube 播放列表
- imgur - REACT 应用程序可以直接访问 imgur API 还是需要在服务器端完成?
- node.js - 模拟 Typeorm QueryBuilder