替换列表列表中的元素

时间:2014-05-02 03:39:56

标签: r replace

R中的apply函数是简化循环以获得输出的好方法。是否有一个等效函数可以帮助人们在替换向量值时避免循环?通过示例可以更好地理解......

# Take this list for example
x = list( list(a=1,b=2), list(a=3,b=4), list(a=5,b=6) )

# To get all of the "a" elements from each list, I can do
vapply(x,"[[",1,"a")
[1] 1 3 5

# If I want to change all of the "a" elements, I cannot do
vapply(x,"[[",1,"a") = 10:12
Error in vapply(x, "[[", 1, "a") = 10:12 : 
  could not find function "vapply<-"
# (this error was expected)

# Instead I must do something like this...
new.a = 10:12
for(i in seq_along(x)) x[[i]]$a = new.a[i]

使用循环是否有更简单或更快的替代方法?

2 个答案:

答案 0 :(得分:7)

一个选项是首先unlist列表x,然后替换名为"a"的值,然后relist新列表u基于x的列表结构。

u <- unlist(x)
u[names(u) == "a"] <- 10:12
relist(u, x)

答案 1 :(得分:2)

vapplysapply的特例,您需要预先指定返回类型。

如果您是sapply的多变量版本,那么您要查找的函数是mapply(或Map,这是一个SIMPLIFY = FALSE的包装器。)

一般来说,带有副作用的函数在R中是不受欢迎的。标准方法是在修改时创建一个新对象。

您可以使用modlifyList执行修改

xnew <- Map(modifyList, x, val = lapply(10:12,function(x) list(a = x)))