r - 计算子字符串中每个下一次出现的字符串
问题描述
今天我遇到了一个我自己无法解决的问题,尽管我正在寻找解决方案——在我看来,要么我的方法是错误的,要么之前没有人问过类似的问题。
我正在玩马尔可夫归因,所以我的列的字符串看起来像这样:
A > B > B > C > B > A > C > B > A
等等
...它是在 postgresql 函数“string_agg”的基础上创建的。
我认为对我来说重要的是分配一个数字,每个字符串出现在整个字符串中的时间。为了清楚起见,在一天结束时,它看起来像这样:
A1 > B1 > B2 > C1 > B3 > A2 > C2 > B4 > A3
存在三个主要挑战:
- 大约有 100 种不同类型的元素需要计算,它们可能会改变时间,因此很难对其进行硬编码,
- 数据集大约有 200k 行,
- 字符串可能长达几百个字符
我唯一想到的是编写某种循环,但感觉它需要很长时间才能完成。
我也想过在 postgresql 级别上解决它,但也找不到有效且简单的解决方案。
解决方案
这是一个粗略的例子data.table
:
library(data.table)
# Example data:
data <- data.table(
s = c("A > B > B > C > B > A > C > B > A",
"A > B > B > C > B > A > C > B > C > D")
)
# Processing steps (can probably be shortened)
n <- strsplit(data[["s"]], " > ")
datal <- melt(n)
setDT(datal)
datal[, original_order := 1:.N
][, temp := paste0(value, 1:.N), by = .(L1, value)
][order(original_order), paste(temp, collapse = " > "), by = L1]
# Output:
L1 V1
1: 1 A1 > B1 > B2 > C1 > B3 > A2 > C2 > B4 > A3
2: 2 A1 > B1 > B2 > C1 > B3 > A2 > C2 > B4 > C3 > D1
推荐阅读
- java - 用于检查 JSON 字段值的 Hamcrest 匹配器是空还是空?
- php - 错误:调用未定义的函数 curl_version() PHP Stripe
- javascript - 将具有两个元素的数组转换为具有一个 k/v-pair 的 JS 对象
- android - 我如何通过一个意图共享纯文本和另一个文件(如 excel 文件)
- r - R - 在使用调查包时制作 ggplot
- xml - PowerShell - XML - 处理具有和不具有属性的节点
- java - 前台服务一段时间后关闭
- python - 如何使用 Python 分析 SQL 查询?
- python - 计算日、周、月、年的分钟
- laravel - Authorize.Net 支付网关徽标问题