矢量化 R 中子列表元素的替换

问题描述 投票:0回答:1

我有一个有点复杂的数据结构,看起来像这样:

x <- list(
  list(1, "a", 2, "b", 0.1),
  list(3, "c", 4, "d", 0.2),
  list(5, "e", 6, "f", 0.3)
)

y <- rep(list(x), 10)

我有一个数据框,

df <- data.frame(
  x1 = c(0.33,1.67,-0.62,-0.56,0.17,0.73,0.59,0.56,-0.22,1.49),
  x2 = c(-0.82,1.22,0.65,0.54,-2.26,1.21,-0.44,-0.92,-0.56,0.50),
  x3 = c(-0.16,0.49,-0.82,-0.71,0.13,1.22,1.23,-0.01,-1.11,0.97)
)

(列名并不重要),基本上数据框的每一行(即 0.33、-0.82 和 -0.16)代表需要位于

x
每个副本的每个子列表的最后位置的值那是在
y
.

我的 python/julia 大脑在循环中工作得最好,所以我可以通过循环 y 得到我想要的结果,然后像这样遍历每个子子列表:

for(i in seq_len(length(y))) {
  for(j in 1:3) {
    y[[i]][[j]][[5]] <- df[[i, j]]
  }
}

这行得通。但是对于大得多的数据,我的速度真的很慢。所以我想找出最快的矢量化版本。

我一直在尝试使用

Map()
但我肯定在某个地方搞砸了并且错过了一个步骤:

y_new <- y
for (j in 1:3) {
  y_new <- Map(function(sublist, value) {sublist[[5]] <- value; sublist},
               y_new, df[, j])
}

不起作用(

identical(y, y_new)
返回
FALSE
我想我在这里缺少一个子设置级别。

我根本没有嫁给

Map()
,从字面上看,我正在寻找的是嵌套for循环的最快替代方案。

非常感谢任何/所有帮助!!

r loops vectorization nested-lists
1个回答
0
投票

有了

Map
,我们可以做

y_new <- Map(\(u, v) Map(\(uu, vv) replace(uu, 5, vv[5]), u, v), y,
       asplit(df, 1))[[1]]
© www.soinside.com 2019 - 2024. All rights reserved.