清理R脚本,使其更加精简

清理R脚本,使其更加精简,r,code-cleanup,R,Code Cleanup,我有一些代码被复制了24次,以便考虑到每天的不同时间。 我想知道简化此代码的可能性: SBS00<-colSums(subset(Total[c(14:54)],Total$Hour=="00:00:00"|Total$Group=="SBS")) SBS01<-colSums(subset(Total[c(14:54)],Total$Hour=="01:00:00"|Total$Group=="SBS")) SBS02<-colSums(subset(Total[c(14:5

我有一些代码被复制了24次,以便考虑到每天的不同时间。 我想知道简化此代码的可能性:

SBS00<-colSums(subset(Total[c(14:54)],Total$Hour=="00:00:00"|Total$Group=="SBS"))
SBS01<-colSums(subset(Total[c(14:54)],Total$Hour=="01:00:00"|Total$Group=="SBS"))
SBS02<-colSums(subset(Total[c(14:54)],Total$Hour=="02:00:00"|Total$Group=="SBS"))
SBS03<-colSums(subset(Total[c(14:54)],Total$Hour=="03:00:00"|Total$Group=="SBS"))
...
SBS23<-colSums(subset(Total[c(14:54)],Total$Hour=="23:00:00"|Total$Group=="SBS"))
SBS <- data.frame(SBS00,SBS01,SBS02,SBS03,...,SBS23)
Total$Uplift00 <- (Total$cols11 - Total$Base00)
Total$Uplift01 <- (Total$cols12 - Total$Base01)
Total$Uplift02 <- (Total$cols13 - Total$Base02)
Total$Uplift03 <- (Total$cols14 - Total$Base03)
...
Total$Uplift30 <- (Total$cols41 - Total$Base30)

SBS00您可以使用
sapply/lappy
对多个列执行此操作

 Hr <- sprintf('%02d:00:00',0:23)
 SBS <- do.call(cbind,lapply(Hr, function(x)
       colSums(subset(Total[14:54], Total$Hour==x & Total$Group=='SBS'))))
 colnames(SBS) <- sprintf('SBS%02d', 0:23)
或者使用
base R中的
aggregate

 T1 <- cbind(Total[c(14:54)], Total['Hour'])
 t(aggregate(.~Hour, T1, subset=Total$Group=='SBS', FUN=sum)[,-1])

T1感谢您的快速响应,我尝试了测试第一部分,但我得到了一个错误,因为Total[14:54]不包括小时或组,而只包括我想要的原始数字。但是当我改变并包含整个总数时,我得到一个错误,x不是一个数值。所以它不把Hr当作一个数字变量吗?@KhaliN我改变了代码。应该是
Total$Hour
Total$Group
@KhalidN我有疑问。你能检查一下你是否需要
&
而不是
。。i、 e.
subset(Total[c(14:54)],Total$Hour==“00:00:00”和Total$Group==“SBS”)
使用您的条件,它还将子集
Group
不等于
SBS
和Hour!='00:00:00`当我们使用条件或时,您是对的!必须是&而不是|,我没有意识到区别。谢谢你的提醒。我正在测试其他代码,如果在测试过程中出现任何问题,我会告诉您。我会尽快测试所有代码:)我有一些代码,我想我可以用您提供的指南来修复,但我还没有正确地完成。希望你能帮忙。这与之前的模式相同:slopesb00
 Hr <- sprintf('%02d:00:00',0:23)
 SBS <- do.call(cbind,lapply(Hr, function(x)
       colSums(subset(Total[14:54], Total$Hour==x & Total$Group=='SBS'))))
 colnames(SBS) <- sprintf('SBS%02d', 0:23)
 library(dplyr)
 Total %>% 
      filter(Group=='SBS') %>% 
      group_by(Hour) %>%
      summarise_each(funs(sum),14:54) %>% 
      select(-Hour) %>% 
      t()
 T1 <- cbind(Total[c(14:54)], Total['Hour'])
 t(aggregate(.~Hour, T1, subset=Total$Group=='SBS', FUN=sum)[,-1])
 nm1 <- sprintf('Base%02d', 0:30) 
 Total[nm1] <- lapply(11:41, function(x) with(Total, base + base*dataval*x))
 nm2 <- sprintf('Uplift%02d', 0:30)
 Total[nm2] <- Total[paste0('cols',11:41)]-Total[nm1]
set.seed(24)
df1 <- as.data.frame(matrix(sample(0:9, 54*100, replace=TRUE), ncol=54))
set.seed(39)
Total <- cbind(df1, Hour=sample(sprintf('%02d:00:00', 0:23), 100, 
   replace=TRUE), Group= sample(c('SBS', 'SBT', 'SBI'), 100, 
      replace=TRUE), stringsAsFactors=FALSE)
 dataval <- 5
 colnames(Total)[1] <- 'base'
  colnames(Total)[11:41] <- paste0('cols', 11:41)