#r #function #datatable
#r #функция #datatable
Вопрос:
Функция
Daily <- function(DF,Roles){
DF <- select(OutputData, (Store.No:Cluster),(Roles:"Total Trading Hours"))
DF$'Roles (Monday)' <- 0
DF$'Roles (Tuesday)' <- 0
DF$'Roles (Wednesday)' <- 0
DF$'Roles (Thursday)' <- 0
DF$'Roles (Friday)' <- 0
DF$'Roles (Saturday)' <- 0
DF$'Roles (Sunday)'<- 0
DF$`Roles (Monday)` <- (DF$`Monday Trading Hours`/DF$`Total Trading
Hours`)*DF$Roles
DF$`Roles (Tuesday)` <- (DF$`Tuesday Trading Hours`/DF$`Total Trading
Hours`)*DF$Roles
DF$`Roles (Wednesday)` <- (DF$`Wednesday Trading Hours`/DF$`Total Trading
Hours`)*DF$Roles
DF$`Roles (Thursday)` <- (DF$`Thursday Trading Hours`/DF$`Total Trading
Hours`)*DF$Roles
DF$`Roles (Friday)` <- (DF$`Friday Trading Hours`/DF$`Total Trading
Hours`)*DF$Roles
DF$`Roles (Saturday)` <- (DF$`Saturday Trading Hours`/DF$`Total Trading
Hours`)*DF$Roles
DF$`Roles (Sunday)` <- (DF$`Sunday Trading Hours`/DF$`Total Trading
Hours`)*DF$Roles
DF <- select(DF,(Store.No:Cluster),Roles,"Roles (Monday)":"Roles (Sunday)")
return(DF)
}
Вызов
RoleDailyOutput <- Daily(RoleDailyOutput, "Programmer")
Ошибка
Error in `$<-.data.frame`(`*tmp*`, "Roles (Monday)", value = numeric(0)) :
replacement has 0 rows, data has 1432
Проблема
Я пытаюсь разобрать «Программист», чтобы заменить «Роли» в функции. Я думаю, проблема в том, что я пытаюсь ссылаться на что-то в кавычках, и ему это не нравится … Как мне заставить это работать? если это вообще проблема. Извините, если это что-то очевидное, я очень новичок в R
Большое спасибо
Комментарии:
1.
Roles
(переменная, содержащая строку ) не может использоваться с.$
Используйте*DF[[Roles]]
.2. Извините, я не понимаю this…so новая строка должна быть:
*DF[[Roles]]' (Monday)' <- 0
3. Нет, ваше использование
DF$Roles
не может работать, замените это. Смотрите мой ответ.
Ответ №1:
Roles
является переменной, содержащей строку. Похоже, это работает в select
(я удивлен, на самом деле), но это не $
будет работать с. Для этого используйте [[
.
colname <- "disp"
mtcars$colname
# NULL
mtcars[[colname]]
# [1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6 275.8 275.8 275.8 472.0 460.0 440.0 78.7 75.7
# [20] 71.1 120.1 318.0 304.0 350.0 400.0 79.0 120.3 95.1 351.0 145.0 301.0 121.0
Ваш код, изменив все *DF$Roles
на *DF[[Roles]]
:
Daily <- function(DF,Roles){
DF <- select(OutputData, (Store.No:Cluster),(Roles:"Total Trading Hours"))
DF$'Roles (Monday)' <- 0
DF$'Roles (Tuesday)' <- 0
DF$'Roles (Wednesday)' <- 0
DF$'Roles (Thursday)' <- 0
DF$'Roles (Friday)' <- 0
DF$'Roles (Saturday)' <- 0
DF$'Roles (Sunday)'<- 0
DF$`Roles (Monday)` <- (DF$`Monday Trading Hours`/DF$`Total Trading
Hours`)*DF[[Roles]]
DF$`Roles (Tuesday)` <- (DF$`Tuesday Trading Hours`/DF$`Total Trading
Hours`)*DF[[Roles]]
DF$`Roles (Wednesday)` <- (DF$`Wednesday Trading Hours`/DF$`Total Trading
Hours`)*DF[[Roles]]
DF$`Roles (Thursday)` <- (DF$`Thursday Trading Hours`/DF$`Total Trading
Hours`)*DF[[Roles]]
DF$`Roles (Friday)` <- (DF$`Friday Trading Hours`/DF$`Total Trading
Hours`)*DF[[Roles]]
DF$`Roles (Saturday)` <- (DF$`Saturday Trading Hours`/DF$`Total Trading
Hours`)*DF[[Roles]]
DF$`Roles (Sunday)` <- (DF$`Sunday Trading Hours`/DF$`Total Trading
Hours`)*DF[[Roles]]
DF <- select(DF,(Store.No:Cluster),Roles,"Roles (Monday)":"Roles (Sunday)")
return(DF)
}
Я заметил еще одну проблему с вашей функцией: аргумент есть DF
, но вы сразу же перезаписываете его OutputData
(который не определен, плохая практика). Попробуйте это вместо:
Daily <- function(DF, Roles) {
# DF <- select(OutputData, (Store.No:Cluster), (Roles:"Total Trading Hours"))
for (wd in c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")) {
nm1 <- sprintf("%s (%s)", Roles, wd)
nm2 <- sprintf("%s Trading Hours", wd)
DF[[ nm1 ]] <- (DF[[ nm2 ]] / DF$`Total Trading Hours`) * DF[[ Roles ]]
}
DF <- select(DF, (Store.No:Cluster), Roles,
sprintf("%s (Monday)", Roles):sprintf("%s (Sunday)", Roles))
return(DF)
}
Комментарии:
1. Это работает! Вы правы, как странно, что это работает в операторе ‘select’… Одна вещь… Есть ли способ сделать заголовки столбцов динамическими? На данный момент он отображает «Роли (понедельник)», но я бы хотел, чтобы он изменился на «Программист (понедельник)» … в зависимости от того, что когда-либо анализируется… Существует ли функция объединения строк в R, подобная
DF$Roles ' (Monday)'
2. Измените
DF$'Roles (Monday)' <- 0
наDF[[paste(Roles, "Monday")]] <- 0
. Предпосылка$
-vs-[[
forRoles
влияет на все это (кромеselect
, по какой-то причине).3. смотрите мой отредактированный ответ, он устраняет другую проблему и сокращает ее.
4. У меня возникли проблемы здесь … если мы на данный момент забудем ваш новый код… оператор select продолжает вызывать ошибку: `Ошибка: невозможно подмножество столбцов, которые не существуют. Столбец x
Roles (Monday)
не существует. Запуститеrlang::last_error()
, чтобы увидеть, где произошла ошибка. `5.
DF <- select(DF,(Store.No:Cluster),Roles,"Roles (Monday)":"Roles (Sunday)")