【发布时间】: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