Итак, проблема, над которой я работаю, требует, чтобы я просмотрел большой массив данных об актерах / актрисах и создал для них профиль на основе фильмов, в которых они уже снялись. Я создал эту функцию профиля, которую можно использовать для одного актера / актрисы, но у меня возникают проблемы с циклическим просмотром всего фрейма данных, чтобы получить профиль для всех актеров / актрис.
profile <- function(actor, df) {
dftest <- subset(df, df$id.x == actor)
fit <- rpart(name.y ~ id.x, method = "class", dftest)
p <- predict(fit, dftest)
return(colnames(p)[max.col(p,ties.method="first")][1])
}
Вот цикл for, который у меня уже есть, но я продолжаю получать ошибки и не уверен, правильно ли я использую этот метод.
for (k in c(1)) {
user.frame <- data.frame()
for (i in df2$id.x) { # df2$id.x is the column of actors names
user.frame[i] <- data.frame(profile(i, df2))
}
df2final <- rbind(final, user.frame)
View(df2fin)
}
** Редактировать **
Это данные, которые входят в функцию профиля
# A tibble: 278,361 x 7
movie_id title id.x name.x id.y id1 name.y
<int> <chr> <int> <chr> <int> <int> <chr>
1 19995 Avatar 65731 Sam Worthington 19995 28 Action
2 19995 Avatar 65731 Sam Worthington 19995 12 Adventure
3 19995 Avatar 65731 Sam Worthington 19995 14 Fantasy
4 19995 Avatar 65731 Sam Worthington 19995 878 Science Fiction
5 19995 Avatar 8691 Zoe Saldana 19995 28 Action
6 19995 Avatar 8691 Zoe Saldana 19995 12 Adventure
7 19995 Avatar 8691 Zoe Saldana 19995 14 Fantasy
8 19995 Avatar 8691 Zoe Saldana 19995 878 Science Fiction
9 19995 Avatar 10205 Sigourney Weaver 19995 28 Action
10 19995 Avatar 10205 Sigourney Weaver 19995 12 Adventure
В идеале я хотел бы, чтобы цикл for выдавал в конце фрейм данных с идентификатором актера в одном столбце и жанром профиля рядом с ним. Ошибка, которую я продолжаю получать, это
Error in `[<-.data.frame`(`*tmp*`, i, value = list(profile.i..df2. = 1L)) :
new columns would leave holes after existing columns
Итак, я использовал ваш код и сделал это:
df <- data.frame(a = rep(df2$id.x))
df$b <- df2$name.y
actor.names <- unique(df$a)
result.file <- matrix(ncol = 2, nrow = length(actor.names))
for(i in 1:length(actor.names)){
dftest <- subset(df, a == actor.names[i]) #subset actor name
fit <- rpart::rpart(b ~ a, method = "class", dftest) #run model
p <- predict(fit, dftest) #predict genre
temp <- colnames(p)[max.col(p,ties.method="first")][1]
result.file[i,1] <- actor.names[i]
result.file[i,2] <- temp
}
Это дало мне эту ошибку:
Error in cbind(yval2, yprob, nodeprob) :
number of rows of matrices must match (see arg 2)
Но результаты, которые я получил, были именно тем, что мне было нужно. Должен ли я волноваться?
result.file
[,1] [,2]
[1,] "65731" "Action"
[2,] "8691" "Action"
[3,] "10205" "Comedy"
[4,] "32747" "Action"
[5,] "17647" "Action"
[6,] "1771" "Drama"
[7,] "59231" "Comedy"
[8,] "30485" "Action"
[9,] "15853" "Adventure"
[10,] "10964" "Драма"
Вот dput (голова (df))
dput(head(df))
structure(list(a = c(65731L, 65731L, 65731L, 65731L, 8691L, 8691L
), b = c("Action", "Adventure", "Fantasy", "Science Fiction",
"Action", "Adventure")), .Names = c("a", "b"), row.names = c(NA,
6L), class = "data.frame")