【问题标题】:Attempting to find data consistency in R尝试在 R 中找到数据一致性
【发布时间】:2014-12-14 13:02:34
【问题描述】:

我发现尝试解决其他人提出的问题作为了解 R 的一种方式很有帮助。就在最近在 StackOverflow 上提出了一个 question,我在尝试实施时遇到了一些问题我的解决方案。

我做的第一件事是重新创建数据框,将其命名为overflow

> Person <- c("Sally", "Bill", "Rob", "Sue", "Alex", "Bob")
> Movie <- c("Titanic", "Titanic", "Titanic", "Cars", "Cars", "Cars")
> Rating <- c(4, 4, 4, 8, 9, 8)
> overflow <- data.frame(Person=Person, Movie=Movie, Rating=Rating)

这给了我一个可重复的工作示例:

> overflow
  Person   Movie Rating
1  Sally Titanic      4
2   Bill Titanic      4
3    Rob Titanic      4
4    Sue    Cars      8
5   Alex    Cars      9
6    Bob    Cars      8

接下来我想设计一个函数来标记评分不一致的行。所以在提出的问题中,每部电影都应该有一致的评分,这意味着 Alex 所在的那一行是有问题的。

需要注意的是,question 的答案中有一些改进的方法,但在深入研究这些方法之前,我想自己解决它,这样我就可以了解更多关于编写函数的信息。

这就是我所做的:

check <- function(x) {
  baddies <- numeric()
  for (i in 1:nrow(x)) {
    if (x$Movie[i] == x$Movie[i + 1] & x$Rating[i] != x$Rating[i + 1]) {
        append(baddies, i)
    }
  }
}

我的目标是创建一个名为 check() 的函数,它将遍历指定数据帧中的所有行,检查电影相同但收视率不同的实例。一旦找到这些,它将通过将行号附加到名为 baddies 的向量来标记行号。

但是,当我运行我的函数时:

> check(overflow)

我收到一条错误消息:

if (x$Movie[i] == x$Movie[i + 1] & x$Rating[i] != x$Rating[i + ] 中的错误: 需要 TRUE/FALSE 的缺失值

我已经仔细考虑了错误消息并重新访问了函数中的逻辑运算符,但我似乎无法弄清楚我哪里出错了。

任何人都可以在这里给我一个正确的方向吗?提前致谢。

【问题讨论】:

  • 这里是典型的“aw-bleep 我应该注意到”:您的循环是 1:nrow 但您随后调用了 x$Rating[i+1] ,因此您已经超出了数组的末尾。
  • 除了 Carl 的评论之外的一些一般性建议。阅读R inferno,然后从您使用的函数集中删除append(至少现在是这样)并学习预先分配(或者更好的是,学习使用*apply函数而不是for循环如果您需要返回值)。还可以了解诸如browser(RStudio 中的断点功能使用)等调试功能。
  • @CarlWitthoft 这是一个很好的收获,谢谢!
  • @Roland 感谢您的建议。我还买了一本极力推荐的书,叫做 The Art of R Programming。我打算阅读这两本书,但你有什么建议我应该首先解决的吗?
  • 在阅读任何书籍之前,您应该阅读官方介绍(“R-intro”)和R inferno。

标签: r


【解决方案1】:

你很接近,只是几个小错误。首先,正如@Carl Witthoft 指出的那样,您的索引范围 1 太大,导致错误。此外,您要使用baddies &lt;- append(baddies,1) 而不是append(baddies,1),否则不会修改对象。最后,确保在函数末尾返回baddies,如下所示:

check <- function(x) {
  baddies <- numeric()
  for (i in 1:(nrow(x)-1)) {
    if (x$Movie[i] == x$Movie[i + 1] & x$Rating[i] != x$Rating[i + 1]) {
      baddies <- append(baddies, i)
    }
  }
  baddies
}
##
> check(overflow)
[1] 4 5

【讨论】:

  • 感谢您的回答,并引导我了解我的功能的哪些部分需要注意。这真的很有帮助,感谢您的宝贵时间。
猜你喜欢
  • 2015-07-16
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2016-09-10
相关资源
最近更新 更多