我发现尝试解决其他人提出的问题有助于学习更多关于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的值
我已经考虑过错误信息并重新访问了函数中的逻辑运算符,但我似乎无法弄清楚我哪里出错了。
有人能在这方面给我一个正确的方向吗?提前谢谢。
答案 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