#r #dataframe #filter #dplyr #int
#r #фрейм данных #Фильтр #dplyr #int
Вопрос:
Я запустил следующий код на data
, который имеет 12
integer
переменную:
calculate_winnings <- function(data, time_durations) {
require("data.table")
calculate_winnings_loop_body <- function(i) {
require("dplyr")
beg <- time_durations[i]
end <- time_durations[i 1]
these_games <- filter(data, gameDuration >= beg amp; gameDuration < end)
team1_wins <- filter(these_games, winner == 1) %>% sum
team2_wins <- filter(these_games, winner == 2) %>% sum
data.frame(team1 = team1_wins, team2 = team2_wins)
}
i <- 1
Samples <- length(time_durations) - 1
l <- lapply(1 : Samples, calculate_winnings_loop_body)
rbindlist(l)
}
double_max <- .Machine["double.xmax"]
winnings <- calculate_winnings(data, c(180, 1200, 1500, 1800, 2100, double_max))
И ошибки:
Error in FUN(X[[i]], ...) :
only defined on a data frame with all
numeric variables
In addition: Warning message:
NAs introduced by coercion to integer range
Я пытался tracback()
:
15: stop("only defined on a data frame w
ith all numeric variables")
14: FUN(X[[i]], ...)
13: lapply(args, function(x) {
x <- as.matrix(x)
if (!is.numeric(x) amp;amp; !is.comple
x(x))
stop("only defined on a data
frame with all numeric variables")
x
})
12: Summary.data.frame(list(gameDuration = integer(0), winner = integer(0),
firstBlood = integer(0), firstTower = integer(0),
firstBaron = integer(0), firstDragon = integer(0),
t1_towerKills = integer(0), t1_baronKills = integer(0),
t1_dragonKills = integer(0), t2_towerKills = integer(0),
t2_baronKills = integer(0), t2_dragonKills = integer(0)),
na.rm = FALSE)
11: function_list[[k]](value)
10: withVisible(function_list[[k]](value))
9: freduce(value, `_function_list`)
8: `_fseq`(`_lhs`)
7: eval(quote(`_fseq`(`_lhs`)), env, env)
6: eval(quote(`_fseq`(`_lhs`)), env, env)
5: withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
4: filter(these_games, winner == 1) %>% sum at debug.R.tmp.R#18
3: FUN(X[[i]], ...)
2: lapply(1:Samples, calculate_winnings_loop_body) at debug.R.tmp.R#34
1: calculate_winnings(data, c(180, 1200, 1500, 1800, 2100, double_max))
Но я не могу понять, почему это происходит.
Редактировать:
Данные загружаются из kaggle и затем обрабатываются:
comb <- function(vec1, vec2, sep = "") {
ret <- c()
for (str1 in vec1)
for (str2 in vec2)
ret <- c(ret, paste(str1, str2, sep = sep))
ret
}
data <- read.csv("data/1_games.csv")
data <- data[, c("gameDuration", "winner",
comb(c("first"), c("Blood", "Tower", "Baron", "Dragon")),
comb(c("t1_", "t2_"), c("towerKills", "baronKills", "dragonKills"))
)]
data <- data[data$gameDuration > 240, ]
data <- data[data$firstTower != 0, ]
Комментарии:
1. Пожалуйста, поделитесь образцами данных.
2. @Sonny Источник данных и
R
скрипт, используемый для их обработки, являются общими.
Ответ №1:
Ваша double_max
переменная представляет собой список, и это создает проблемы ниже по потоку. Если вы этого хотите, преобразуйте в числовой, и остальной ваш код должен работать
double_max <- as.numeric(.Machine["double.xmax"])
Пожалуйста, проверьте
Предложение: Пожалуйста, переместитесь require
за пределы функции