试图在R中找到数据一致性

时间:2014-12-13 21:22:06

标签: r

我发现尝试解决其他人提出的问题有助于学习更多关于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的答案中有这样做的精致方法,但在深入研究那些我想自己解决它的方法之前,我可以学习更多关于编写函数的知识。 / p>

这就是我的所作所为:

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]&amp; x $ Rating [i]!= x $ Rating [i +:     缺少需要TRUE / FALSE的值

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

有人能在这方面给我一个正确的方向吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

你很接近,只是一些小错误。首先,正如@Carl Witthoft指出的那样,你的索引范围是1太大,导致错误。此外,您要使用append(baddies,1)而不是baddies <- 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