【问题标题】:using loops or lapply in R在 R 中使用循环或 lapply
【发布时间】:2014-12-05 19:33:26
【问题描述】:

我正在尝试迭代循环遍历 R df 的子集,但遇到了一些麻烦。 df$A 包含 0-1000 的值。我想根据 df$A 的每个唯一值对 df 进行子集化,操作该数据,将其保存为 newdf,然后最终将 1000 个生成的 newdf 连接(rbind)到一个 df 中。

我当前的单次迭代代码(无循环)是这样的:

dfA = 1
dfA_1 <- subset(df, A == dfA)
:: some ddply commands on dfA_1 altering its length and content ::

编辑:澄清一下,在单次迭代版本中,一旦我有了子集,我就一直在使用 ddply 来计算包含某些值的行数。并非所有子集都具有所有值,因此结果可以是可变长度的。因此,我一直将结果附加到骨架 df 中,该骨架 df 说明了 df 的某个子集可能没有任何包含我期望的值的行(即 nrow = 0)的情况。理想情况下,对于 A 的每个实例,我的子集都是固定长度的。如何将其合并到单个(或多个)plyr 或 dplyr 代码集中?

我对 for 循环的问题是长度不是变量,而是 df$A 的唯一值。

我的问题如下: 1. 我将如何使用 for 循环(或某种形式的应用)来执行此操作? 2. 除了生成迭代 df 名称之外,这些操作能否用于操作数据(例如,名为 dfA_1 的 df 将是 dfA_x,其中 x 是 df$A 从 1 到 1000 的值之一)。我目前的想法是,然后我会 rbind 1000 个 dfA_x,尽管这看起来很麻烦。

非常感谢您的帮助。

【问题讨论】:

  • dplyr 的答案既漂亮又现代,但即使是普通的旧 plyr 也取代了循环并适用。如果您对A 的每个级别都做某事,那么您ddply(df, .variables = "A", ...)。不需要循环中的子集或任何此类废话。
  • 在基础 R 中,您可以执行类似 do.call(rbind,lapply(split(df,df$A),function(sub.df){...})) 的操作。你是什​​么意思“改变它的长度和内容”?
  • 目前,我一直在使用 ddply 对一组值的 nrow 进行计数,但由于并非所有子集都包含所有值,因此我一直将结果附加到固定长度的骨架 df 中。我在上面的问题中添加了更多信息......如果不清楚,请告诉我。

标签: r for-loop plyr lapply


【解决方案1】:

您应该为此使用 dplyr 包。你想做的可能会采取这种形式:

library(dplyr)
df %>%
  group_by(A) %>%
  summarize( . . . ) 

它会更容易做,更容易阅读,更不容易出错,而且速度更快。

http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2012-05-10
    • 2020-10-16
    • 2021-07-31
    • 2021-02-16
    • 2020-06-05
    • 2020-09-20
    相关资源
    最近更新 更多