今天,尽管遇到了寻求解决方案的问题,但我仍然无法独自解决一个问题-在我看来,我的方法是错误的,还是没人问过类似的问题。
我正在研究Markov归因,所以我有一些带有类似字符串的列:
A > B > B > C > B > A > C > B > A
等等
...它是基于postgresql函数'string_agg'创建的。
我认为对我来说很重要的是分配一些时间,每个时间在整个字符串中都出现。为了清楚起见,最终,它看起来像这样:
A1 > B1 > B2 > C1 > B3 > A2 > C2 > B4 > A3
存在三个主要挑战:
我想到的唯一一件事就是编写某种循环,但是直到完成为止,这似乎需要花费很多时间。
我也考虑过在postgresql级别上解决它,但是也找不到高效,简单的解决方案。
如何执行此操作在gsubfn插图中进行了说明。首先使用那里的代码,我们pword
使用方法pre
和定义原型对象fun
。pre
初始化单词列表(存储遇到的每个单词的当前计数),并fun
在每次遇到新单词时对其进行更新,并且还对该单词进行后缀,并通过计数返回后缀单词。
定义完上述内容后,请gsubfn
使用运行pword
。对于输入的每个分量gsubfn
将首先运行pre
,然后对于正则表达式的每个匹配\\w+
gsubfn
将输入匹配到fun
,运行fun
并将匹配替换为的输出fun
。
我们已经假设要添加带计数的单词的单词是匹配的\w+
,在问题中的示例就是这种情况,但是如果实际数据不同,则可能需要更改模式。
library(gsubfn)
s <- rep("A > B > B > C > B > A > C > B > A", 3) # sample input
pwords <- proto(
pre = function(this) { this$words <- list() },
fun = function(this, x) {
if (is.null(words[[x]])) this$words[[x]] <- 0
this$words[[x]] <- this$words[[x]] + 1
paste0(x, words[[x]])
}
)
gsubfn("\\w+", pwords, s)
给予:
[1] "A1 > B1 > B2 > C1 > B3 > A2 > C2 > B4 > A3"
[2] "A1 > B1 > B2 > C1 > B3 > A2 > C2 > B4 > A3"
[3] "A1 > B1 > B2 > C1 > B3 > A2 > C2 > B4 > A3"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句