【问题标题】:Parsing Multiple Naming Arguments in a Function using R使用 R 解析函数中的多个命名参数
【发布时间】:2021-01-23 15:00:11
【问题描述】:

功能

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 很陌生

非常感谢

【问题讨论】:

  • Roles(一个包含字符串的变量)不能与$一起使用。使用*DF[[Roles]]
  • 对不起,我不明白这个...所以新行应该是:*DF[[Roles]]' (Monday)' &lt;- 0
  • 不,您对DF$Roles 的使用无法正常工作,请替换它。看我的回答。

标签: r function datatable


【解决方案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)
}

【讨论】:

  • 行得通!你是对的,它在“选择”语句中工作有多奇怪......有一件事......有没有办法让列标题动态化?目前它显示“角色(星期一)”,但我希望它更改为“程序员(星期一)”......取决于正在解析的内容......R中是否有像DF$Roles + ' (Monday)'这样的连接字符串函数
  • DF$'Roles (Monday)' &lt;- 0 更改为 DF[[paste(Roles, "Monday")]] &lt;- 0$-vs-[[Roles 的前提会影响到所有这些(由于某种原因,select 除外)。
  • 查看我编辑的答案,它修复了另一个问题并缩短了它。
  • 我在这里遇到了麻烦...如果我们暂时忘记了您的新代码... select 语句不断导致错误:` 错误:无法对不存在的列进行子集化. x 列 Roles (Monday) 不存在。运行rlang::last_error() 以查看错误发生的位置。`
  • DF &lt;- select(DF,(Store.No:Cluster),Roles,"Roles (Monday)":"Roles (Sunday)")
猜你喜欢
  • 1970-01-01
  • 2022-10-12
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多