我有一个有点复杂的数据结构,看起来像这样:
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循环的最快替代方案。
非常感谢任何/所有帮助!!
有了
Map
,我们可以做
y_new <- Map(\(u, v) Map(\(uu, vv) replace(uu, 5, vv[5]), u, v), y,
asplit(df, 1))[[1]]