我正在尝试编写一个循环来遍历数据帧并纠正不正确的值(由universal制作的EG喜剧片将其全球总票房放大1.1倍,而由派拉蒙制作的喜剧片将其国内总票房提高0.8美元)数据帧在不同的列中指定电影、流派、工作室和总票房
for (i in 1:nrow(movie_data)) {
movies <- movie_data[i,]
if (distributor == "Universal") {
if (genre == "Comedy") {
movies$worldwide_gross <- movies$worldwide_gross / 1.1
}
} else if (distributor == "Paramount") {
if (genre == "Comedy") {
movies$domestic_gross <- movies$domestic_gross - 0.8
} else if (genre == "Drama") {
movies$domestic_gross <- movies$domestic_gross - 1.2
}
}
}是什么导致了我的错误?
发布于 2019-09-18 11:08:18
我认为你不需要for loop来实现你想要的东西。但是,如果您不实际分享您的数据的玩具示例,就很难知道。dput(head(movies))会这么做的。
使用data.table,操作可能非常简单:
library(data.table)
setDT(movies)
movies[distributor == "Universal" & genre == "Comedy",
worldwide_gross := worldwide_gross / 1.1]
movies[distributor == "Paramount" & genre == "Comedy",
domestic_gross := domestic_gross - 0.8]
movies[genre == "Drama",
domestic_gross - 1.2]发布于 2019-09-18 11:19:46
正如已经在评论中提到的,显然有更好、更优化的方法来做到这一点。(来自dplyr,ifelse的case_when),但是如果您必须显式地使用for循环,则可以使用索引对行值进行子集设置,然后检查各种条件。
for (i in seq_len(nrow(movie_data))) {
if (movie_data$distributor[i] == "Universal" & movie_data$genre[i] == "Comedy")
movie_data$worldwide_gross[i] <- movies$worldwide_gross[i]/ 1.1
else if (movie_data$distributor[i] == "Paramount") {
if (movie_data$genre[i] == "Comedy") {
movie_data$domestic_gross[i] <- movie_data$domestic_gross[i] - 0.8
} else if (movie_data$genre[i] == "Drama") {
movie_data$domestic_gross[i] <- movie_data$domestic_gross[i] - 1.2
}
}
}https://stackoverflow.com/questions/57984366
复制相似问题