【问题标题】:Using r to loop and match data使用 r 循环和匹配数据
【发布时间】:2013-09-26 18:58:56
【问题描述】:

我已将一个 csv 文件上传到 r,其中大部分是二进制数据。我想要做的是根据“a”列中的相应条目操作“b”列中的数据。

例如,我希望循环遍历我的整个数据集,并且对于第 2 列中包含“1”条目的每一行,检查以查看同一行中第 3 列中的条目。然后,找出这些成功查询中有多少存在。

同样,我有几列大整数,我很想通过检查其中一个大数是否大于另一个来确认其他二进制列之一。例如,列“3”是“主队获胜?”的二进制结果。然后我在“主队得分”和“客队得分”列中获得了比赛的得分。我真的很想创建一个循环来查看“主队获胜”中的条目是否由“主队得分”>“客队得分”中的条目确认。

谢谢

【问题讨论】:

  • 合并和匹配函数似乎是明显的无循环方法。要求您提供 dput 输出或代码以提供示例。
  • R 用户通常使用向量化操作而不是循环,因为 R 中的循环很慢,除非它们非常简单。实际上,您需要的只是对列名求和一个布尔表达式(使用& 连接多个布尔表达式)。求和将 TRUE 添加为 1,将 FALSE 添加为 0,因此匹配查询的数量。使用示例数据集编辑您的问题,您将获得更具体的代码答案。

标签: r loops


【解决方案1】:

这样的?

library(data.table)
dataset <- data.table(
Homescore = c(2,4,8,0,3,2,3,4),
Awayscore = c(3,2,3,4,2,4,8,0),
Homewin = c(1,0,0,1,1,1,0,1)
)

NoOfSuccess <- dim(
dataset[Homescore > Awayscore & Homewin == 1]
)[1]

NoOfFailure <- dim(
dataset[Homescore > Awayscore & Homewin == 0]
)[1]

NoOfSuccess
#[1] 2
NoOfFailure
#[1] 2

【讨论】:

  • dataset[,sum(Homescore &gt; Awayscore &amp; Homewin == 1)]nrow(dataset[Homescore &gt; Awayscore &amp; Homewin == 1]) 更有效。为什么要创建一个可能很大的子集结果,只是为了计算它的行​​数?
  • @MatthewDowle - 我试图在解释思考过程方面非常清楚。就编码效率而言,您是绝对正确的。
  • 啊,我明白了。再次阅读这篇文章,实际上非常巧妙的是,如何使用data.table 语法如此快速地设置新用户 (Dave)。无需学习 11 多种功能套件,您只需将逻辑粘贴在 [] 中即可。真的很简单,不是吗:)
  • 对于刚开始 R 的人来说,data.table 实在是太过分了(和一个单独的语法)。无论如何,这在基础 R 中很容易做到。
猜你喜欢
  • 2020-03-15
  • 2013-06-25
  • 1970-01-01
  • 2018-11-22
  • 2013-03-27
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多