在 R 中查找 data.table 行的模式
Finding patterns across rows of data.table in R
我试图在 data.table 的行中查找模式,同时仍然保持行之间的数据链接。这是一个简化的例子:
Row ID Value
1 C 1000
2 A 500
3 T -200
4 B 5000
5 T -900
6 A 300
我想在连续的行中搜索 "ATB" 的所有实例,并从值列中输出整数。理想情况下,我也想对实例数量进行分类。输出 table 将如下所示:
String Frequency Value1 Value2 Value 3
ATB 1 500 -200 5000
CAT 1 1000 500 -200
由于 data.table 包似乎面向提供按列或按行的操作,我认为这应该是可能的。但是,我完全不知道从哪里开始。任何正确方向的指示将不胜感激。
谢谢!
library("plyr")
library("stringr")
df <- read.table(header = TRUE, text = "Row ID Value
1 C 1000
2 A 500
3 T -200
4 B 5000
5 T -900
6 A 300
7 C 200
8 A 700
9 T -500")
sought <- c("ATB", "CAT", "NOT")
ids <- paste(df$ID, collapse = "")
ldply(sought, function(id) {
found <- str_locate_all(ids, id)
if (nrow(found[[1]])) {
vals <- outer(found[[1]][,"start"], 0:2, function(x, y) df$Value[x + y])
} else {
vals <- as.list(rep(NA, 3))
}
data.frame(ID = id, Count = str_count(ids, id),
setNames(as.data.frame(vals), paste0("Value", 1:3)))
})
这是使用 stringr
和 plyr
的解决方案。这些 ID 被折叠成一个字符串,找到每个目标的所有实例,然后用相关列构建一个数据框。
我试图在 data.table 的行中查找模式,同时仍然保持行之间的数据链接。这是一个简化的例子:
Row ID Value
1 C 1000
2 A 500
3 T -200
4 B 5000
5 T -900
6 A 300
我想在连续的行中搜索 "ATB" 的所有实例,并从值列中输出整数。理想情况下,我也想对实例数量进行分类。输出 table 将如下所示:
String Frequency Value1 Value2 Value 3
ATB 1 500 -200 5000
CAT 1 1000 500 -200
由于 data.table 包似乎面向提供按列或按行的操作,我认为这应该是可能的。但是,我完全不知道从哪里开始。任何正确方向的指示将不胜感激。
谢谢!
library("plyr")
library("stringr")
df <- read.table(header = TRUE, text = "Row ID Value
1 C 1000
2 A 500
3 T -200
4 B 5000
5 T -900
6 A 300
7 C 200
8 A 700
9 T -500")
sought <- c("ATB", "CAT", "NOT")
ids <- paste(df$ID, collapse = "")
ldply(sought, function(id) {
found <- str_locate_all(ids, id)
if (nrow(found[[1]])) {
vals <- outer(found[[1]][,"start"], 0:2, function(x, y) df$Value[x + y])
} else {
vals <- as.list(rep(NA, 3))
}
data.frame(ID = id, Count = str_count(ids, id),
setNames(as.data.frame(vals), paste0("Value", 1:3)))
})
这是使用 stringr
和 plyr
的解决方案。这些 ID 被折叠成一个字符串,找到每个目标的所有实例,然后用相关列构建一个数据框。