我在R中有一个对象列表,我使用lapply
执行不同的操作。但是,在下一步中,我想将函数仅应用于列表的某些元素。因此,我想再次将列表拆分为原始变量。 R中有命令吗?它是否可能,或者每次我想要这样做时都必须创建新变量?
请参阅以下示例以明确我的意思:
# 3 vectors:
test1 <- 1:3
test2 <- 2:6
test3 <- 8:9
# list l:
l <- list(test1,test2,test3)
# add 3 to each element of the list:
l <- lapply(l, function(x) x+3)
# In effect, list l contains modified versions of the three test vectors
问题:如何再次将这些修改分配给原始变量?我不想这样做:
test1 <- l[[1]]
test2 <- l[[2]]
test3 <- l[[3]]
# etc.
有更好的方法吗?
答案 0 :(得分:1)
假设您是R的新手,更直观的方法可能是使用for循环。我认为Richard Scriven的方法更好。它至少更简洁。
for(i in seq(1, length(l))){
name <- paste0("test",i)
assign(name, l[[i]] + 3)
}
总而言之,你的最终目标有点可疑。我建议您将结果保存在列表或矩阵中,特别是如果您是R的新手。通过将所有结果包含在列表或矩阵中,您可以继续使用lapply和sapply等函数来操作结果。
松散地说,Richard Scriven在评论中的方法是将列表中的每个元素转换为一个对象,然后将这些对象传递给封闭的环境,在这种情况下是全局环境。他本可以将物体传递到任何环境。例如,试试,
e <- new.env()
list2env(lapply(mget(ls(pattern = "test[1-3]")), "+", 3), e)
请注意,test1
,test2
和test3
现在位于环境e
中。试试e$test1
或ls(e)
。深入到括号中,对ls
的调用使用简单的正则表达式来告诉mget
要查找的对象的名称。有关更多信息,请查看http://adv-r.had.co.nz/Environments.html。