【发布时间】: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 中。我在上面的问题中添加了更多信息......如果不清楚,请告诉我。