R语言 将公式作为有向树导航以查找符号的所有出现

wqlqzqxt  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(52)

在R中,公式可以看作是一棵树,其中父节点位于索引[[1]]上,左项和右项位于后续索引中。
例如,公式f定义为:

f <- y ~ (a*x) +(b*x) + (c*z)

f[[1]]~f[[2]]y。最后一项f[[3]]将返回等式的右侧。f[[3]][[2]][[2]][[2]][[3]]最终返回第一次出现的x
从这个Angular 来看,这个等式是一个类似于下面的树形数据结构:

我如何在树中导航以获得所有通向某个符号的路径?
例如,要到达x,有两条路径,{3,2,2,2,3}和{3,2,3,2,3}。我们可以用f[[3]][[2]][[2]][[2]][[3]]来检查,我们确实得到了x在树中的第一次出现。

px9o7tmv

px9o7tmv1#

可以使用rrapply::rrapply()递归搜索元素并返回索引:

library(rrapply)

find_ind <- \(f, value) {
  rrapply(
    f,
    condition = \(x) x == value,
    f = \(x, .xpos) .xpos,
    how = "flatten"
  )
}

find_ind(f, "x")

[[1]]
[1] 3 2 2 2 3

[[2]]
[1] 3 2 3 2 3

确认这些是公式中x的索引:

lapply(find_ind(f, "x"), \(i) f[[i]])

[[1]]
x

[[2]]
x
enyaitl3

enyaitl32#

下面是另一个在rrapply::rrapply()中使用how = "melt"选项的解决方案。这将返回语法树中每个级别和每个叶子的索引,之后我们可以简单地过滤对应于x值的行:

library(rrapply)

f <- y ~ (a*x) +(b*x) + (c*z)

rrapply(f, how = "melt") |>
  subset(value == "x")

#>    L1 L2 L3 L4 L5 value
#> 8   3  2  2  2  3     x
#> 12  3  2  3  2  3     x

或者更短,使用rrapply::rrapply()中的condition参数:

rrapply(f, condition = \(x) x == "x", how = "melt")
#>   L1 L2 L3 L4 L5 value
#> 1  3  2  2  2  3     x
#> 2  3  2  3  2  3     x

相关问题