首页 > 解决方案 > 计算子字符串中每个下一次出现的字符串

问题描述

今天我遇到了一个我自己无法解决的问题,尽管我正在寻找解决方案——在我看来,要么我的方法是错误的,要么之前没有人问过类似的问题。

我正在玩马尔可夫归因,所以我的列的字符串看起来像这样:

A > B > B > C > B > A > C > B > A

等等

...它是在 postgresql 函数“string_agg”的基础上创建的。

我认为对我来说重要的是分配一个数字,每个字符串出现在整个字符串中的时间。为了清楚起见,在一天结束时,它看起来像这样:

A1 > B1 > B2 > C1 > B3 > A2 > C2 > B4 > A3

存在三个主要挑战:

我唯一想到的是编写某种循环,但感觉它需要很长时间才能完成。

我也想过在 postgresql 级别上解决它,但也找不到有效且简单的解决方案。

标签: rstatistics

解决方案


这是一个粗略的例子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

推荐阅读