R:将向量列表中的向量指定为数据帧列表中数据帧列的值

R:将向量列表中的向量指定为数据帧列表中数据帧列的值,r,list,R,List,我有两个长度相等的列表:一个是数据帧列表,另一个是向量列表,这样每个向量的长度与第一个列表的相应数据帧中的行数一致。我想将第二个列表中的向量指定为每个数据帧中第一列的值。下面的代码可能更容易解释: for (i in seq_along(data)){ data[[c(i, 1)]] = links[[i]] } ,其中,data是数据帧列表,links是向量列表。虽然这段代码运行良好,而且在速度方面没有特别需要避免for循环,但我想知道

我有两个长度相等的列表:一个是数据帧列表,另一个是向量列表,这样每个向量的长度与第一个列表的相应数据帧中的行数一致。我想将第二个列表中的向量指定为每个数据帧中第一列的值。下面的代码可能更容易解释:

for (i in seq_along(data)){
   data[[c(i, 1)]] = links[[i]]
                         }

,其中,
data
是数据帧列表,
links
是向量列表。虽然这段代码运行良好,而且在速度方面没有特别需要避免
for
循环,但我想知道是否有其他方法可以在没有
for
的情况下执行相同的操作

由于您的数据已经被分离为独立的列表组件,因此如果没有某种隐藏或显式循环,就无法执行此操作。这是因为不可能对多个独立的列表组件进行任何形式的矢量化或整体化操作;列表的本质是一系列(可允许的)异构对象,不能作为一个单元进行访问

您可以在
lappy()
中用隐藏循环替换for循环,但这并没有多大意义:

l1 <- list(data.frame(a=1:3,b=4:6), data.frame(a=10:14,b=15:19) );
l2 <- list(7:9, 20:24 );
invisible(lapply(seq_along(l1), function(i) l1[[i]][,1] <<- l2[[i]] ));
l1;
## [[1]]
##   a b
## 1 7 4
## 2 8 5
## 3 9 6
## 
## [[2]]
##    a  b
## 1 20 15
## 2 21 16
## 3 22 17
## 4 23 18
## 5 24 19

正如您所看到的,for循环显然比这些替代方法更直接、更合理。

因为
数据
链接
具有相同的长度,并且您正在逐个替换,
Map()
和/或
mappy()
将是一个不错的选择。使用另一个答案的数据

data <- list(data.frame(a = 1:3, b = 4:6), data.frame(a = 10:14, b = 15:19))
links <- list(7:9, 20:24)

数据请包括
dput(data)
dplut(links)
的输出,或每个对象的最小代表性示例。
c(i,1)
是一个向量,但据我所知,
[[
仅适用于标量。@nrussell,谢谢,下次会这样做。啊,我忘了
Map()
mappy()
,不错的添加@RichardScriven。虽然我想指出,
Map()
mapply()
的包装,
mapply()
sapply()
的包装,而
sapply()
lapply()的包装
,因此这就简化为相同的代码,尽管肯定比直接的
lappy()在简洁和优雅方面有所改进
我在回答中给出的调用。虽然它实际上不是同一个代码。你使用的是
实际上是我对
的使用,是的,但是如果你调用其他东西,比如
data2 Aha,它不会被覆盖,对吧:“mapply是sapply的多变量版本”(),我认为这意味着它是一个包装器,但它不是。这一点很好。
data <- list(data.frame(a = 1:3, b = 4:6), data.frame(a = 10:14, b = 15:19))
links <- list(7:9, 20:24)
Map("[<-", data, 1, value = links)
# [[1]]
#   a b
# 1 7 4
# 2 8 5
# 3 9 6
#
# [[2]]
#    a  b
# 1 20 15
# 2 21 16
# 3 22 17
# 4 23 18
# 5 24 19
Map(function(x, y, z) { x[y] <- z; x }, data, 1, links)