Анализ нескольких аргументов именования в функции с использованием R

#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- [[ for Roles влияет на все это (кроме select , по какой-то причине).

3. смотрите мой отредактированный ответ, он устраняет другую проблему и сокращает ее.

4. У меня возникли проблемы здесь … если мы на данный момент забудем ваш новый код… оператор select продолжает вызывать ошибку: `Ошибка: невозможно подмножество столбцов, которые не существуют. Столбец x Roles (Monday) не существует. Запустите rlang::last_error() , чтобы увидеть, где произошла ошибка. `

5. DF <- select(DF,(Store.No:Cluster),Roles,"Roles (Monday)":"Roles (Sunday)")