【发布时间】:2018-11-20 20:16:29
【问题描述】:
您好,我正在尝试学习如何遍历数据框中的多个组并应用某些算术运算。我没有编程背景,并且正在努力遍历多个条件。
我的数据如下所示:
Event = c(1,1,1,1,1,2,2,2,2,2)
Indiv1=c(4,5,6,11,45,66,8,9,32,45)
Indiv2=c(7,81,91,67,12,34,56,78,90,12)
Category=c(1,1,2,2,2,1,2,2,1,1)
Play_together=c(1,0,1,1,1,1,1,1,0,1)
Money=c(23,11,78,-9,-12,345,09,43,21,90)
z = data.frame(Event,Indiv1,Indiv2,Category,Play_together,Money)
我想做的是查看每个事件和每个类别,并在 Play_together == 1 的情况下取 Money 的平均值。当 Play_together==0 时,我想申请 Money/100。
我知道循环看起来像下面这样:
for i in 1:nrow(z){
#loop for event{
#loop for Category{
#Define avg or division function
}
}
}
但是,我似乎无法使用嵌套循环来实现这一点。我看到另一个使用 dplyr 包的帖子(链接:apply function for each subgroup)。我想知道是否有人可以帮助我在不使用任何包的情况下实现这一点(我知道与使用 R 包相比,这可能需要更长的时间)。我正在尝试学习 R,这是我第一次使用嵌套循环。
对于事件 1,以下情况成立:
a) 对于类别 1:
Play_together ==1 在第 1 行;我们取货币价值的平均值,因此最终输出 = 23/1= 23
Play_together==0 在第 2 行;我们拿钱/100=0.11
b) 对于第 2 类: Play_together == 1 用于所有观察。我们对所有三个观察结果都取 avg Money。
这同样适用于事件 2。在我的实际数据集中,我的事件 = 600,类别数量在 1 到 10 之间。有些事件可能只有 1 个类别,最多有 10 个类别。所以任何功能都需要非常灵活。我的数据集中的观察总数约为 150 万,因此循环过程中的任何更改以减少执行操作所需的时间都将非常有帮助(尽管在这个阶段我的优先级是循环过程本身)。
如果你能告诉我如何使用嵌套循环并简要解释这些步骤,那将是一个很大的帮助。非常感谢。
【问题讨论】:
-
您的示例输出与示例数据不同...(具有事件“3”)
-
感谢@Wimpel 指出这一点。我不得不多次更改示例数据。我现在改了。
-
你不应该为此使用循环,使用
dplyr或data.table包,或在基础 R 中aggregate或by。 -
这个最终用途是在吉布斯抽样框架(贝叶斯统计)中,我需要遵循这个程序。我试图以一种非常简单的方式分解问题,以便我可以学习如何在 R 中使用嵌套循环。@Gregor
-
除非您想强制 R 以蜗牛的速度移动,否则您需要尽可能使用矢量化。所以不要遍历每一行,至少在类别级别开始你的外部循环。你可以让你的外循环超过类别,你的内循环超过事件,然后显示一个尝试!当你展示的只是一个没有任何填充物的裸露骨架时,真的很难知道你需要什么帮助。
标签: r loops data-manipulation