【问题标题】:Convert my simple 'for loop' into an apply function将我简单的“for循环”转换为应用函数
【发布时间】: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 &lt;- lst$data[c(1,4,5)]; lst;})?
  • apply 用于有尺寸的对象。
  • @r2evans,这行得通,但你能通过它吗? lst 是来自 dplyr 还是只是一个变量名? ;的功能?真的想确保我理解......谢谢
  • 不,lst 这里只是一个在匿名函数中命名的临时变量,ala function(lst) {...}。它可能是asome_other_variable_name,只要内部代码引用该名称而不是lst。至于分号:通常 R 中的代码行以换行符终止或分隔,但也可以使用分号。我真的只在 cmets 中的 SO 上使用分号,否则我倾向于使用多行调用。
  • 是的。代码赋值行的返回值是(不可见的)赋值,而不是整个对象lst。您需要返回整个(更新的)对象,因此您需要明确。

标签: r apply lapply sapply mapply


【解决方案1】:

创建这样一个嵌套列表是没有必要的,而且很复杂。 保持简单:获取初始列表并为新表创建一个新列表。

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"]]

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多