R语言如何识别数据框全0 DR列并在计算datas时排除
解决方案
你可以通过dplyr的select() + where()组合实现自动剔除全0 DR列的需求,修改后的完整代码如下:
library(dplyr) library(lubridate) library(tidyverse) df1 <- structure( list(date1 = c("2021-06-28","2021-06-28","2021-06-28","2021-06-28","2021-06-28", "2021-06-28","2021-06-28","2021-06-28"), date2 = c("2021-04-02","2021-04-03","2021-04-08","2021-04-09","2021-04-10","2021-07-01","2021-07-02","2021-07-03"), Week= c("Friday","Saturday","Thursday","Friday","Saturday","Thursday","Friday","Monday"), DR01 = c(4,1,4,3,3,4,3,6), DR02= c(4,2,6,7,3,2,7,4),DR03= c(9,5,4,3,3,2,1,5), DR04 = c(5,4,3,3,6,2,1,9),DR05 = c(5,4,5,3,6,2,1,9), DR06 = c(2,4,3,3,5,6,7,8),DR07 = c(2,5,4,4,9,4,7,8), DR08 = c(0,0,0,1,2,0,0,0),DR09 = c(0,0,0,0,0,0,0,0),DR010 = c(0,0,0,0,0,0,0,0),DR011 = c(0,4,0,0,0,0,0,0), DR012 = c(0,0,0,0,0,0,0,0)), class = "data.frame", row.names = c(NA, -8L)) # 新增:自动剔除所有取值全为0的DR开头列 df1 <- df1 %>% select(-where(~ all(.x == 0) & grepl("^DR", cur_column()))) #Generate graph dmda<-"2021-07-01" datas<-df1 %>% filter(date2 == ymd(dmda)) %>% summarize(across(starts_with("DR"), sum)) %>% pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>% mutate(name = as.numeric(name)) colnames(datas)<-c("Days","Numbers") attach(datas) plot(Numbers ~ Days, ylim=c(0,20)) model <- nls(Numbers ~ b1*Days^2+b2,start = list(b1 = 47,b2 = 0)) new.data <- data.frame(Days = seq(min(Days),max(Days),len = 45)) lines(new.data$Days,predict(model,newdata = new.data))
代码说明
- 新增的预处理逻辑会遍历所有列,仅剔除列名以DR开头、且整列所有值都为0的无效列,其他列不受影响。
- 如果你需要的是剔除
date2 == dmda筛选后求和为0的DR列(而非整列全0),可以去掉预处理步骤,在pivot_longer之后补充一行filter(val != 0)即可。
运行效果如下图:
内容的提问来源于stack exchange,提问作者user16774617
相关产品推荐
相关产品推荐

