将我简单的“ for循环”转换为apply函数

时间:2018-10-11 21:10:35

标签: r apply lapply sapply mapply

我正努力拥抱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

1 个答案:

答案 0 :(得分:0)

创建这样的嵌套列表不是必需的,并且使事情变得复杂。 保持简单:获取初始列表并为新表创建一个新列表。

olds <- list(mtcars=mtcars, iris=iris)
news <- lapply(mylist, function(df) df[, c(1, 4, 5)])

两个列表都具有相同的数据帧名称(“ mtcars”和“ iris”),因此很容易从news列表和olds列表中选择对应的数据帧彼此。

# access the new data frame from the old data frame `iris`
news[["iris"]] # news[["mtcars"]]
# returns the corresponding new data frame of the "iris" data frame.

# return original data frame
olds[["iris"]] # olds[["mtcars"]]