【发布时间】:2019-03-17 01:29:51
【问题描述】:
我正在尝试更多地拥抱apply 家庭,但仍然遇到了麻烦。我主要理解 lapply 的简单案例(如下所示),但在使用更复杂的 apply 函数时遇到了问题。
我有一个for 循环函数,它遍历一个嵌套列表并添加一个新的子集列表。我如何使用apply 系列函数编写此代码?
mylist <- list(mtcars=mtcars, iris=iris)
mylist <- lapply(mylist,
function(sub) list(data=sub))
for (i in head(seq_along(mylist))){
mylist[[i]]$new <- mylist[[i]]$data[,c(1,4,5)]
}
这给出了:
> mylist$mtcars$new
mpg hp drat
Mazda RX4 21.0 110 3.90
Mazda RX4 Wag 21.0 110 3.90
Datsun 710 22.8 93 3.85
Hornet 4 Drive 21.4 110 3.08
> mylist$iris$new
Sepal.Length Petal.Width Species
1 5.1 0.2 setosa
2 4.9 0.2 setosa
3 4.7 0.2 setosa
4 4.6 0.2 setosa
【问题讨论】:
-
lapply(mylist, function(lst) { lst$new <- lst$data[c(1,4,5)]; lst;})? -
apply用于有尺寸的对象。 -
@r2evans,这行得通,但你能通过它吗?
lst是来自dplyr还是只是一个变量名?;的功能?真的想确保我理解......谢谢 -
不,
lst这里只是一个在匿名函数中命名的临时变量,alafunction(lst) {...}。它可能是a或some_other_variable_name,只要内部代码引用该名称而不是lst。至于分号:通常 R 中的代码行以换行符终止或分隔,但也可以使用分号。我真的只在 cmets 中的 SO 上使用分号,否则我倾向于使用多行调用。 -
是的。代码赋值行的返回值是(不可见的)赋值,而不是整个对象
lst。您需要返回整个(更新的)对象,因此您需要明确。
标签: r apply lapply sapply mapply