帮我优化这段代码map_dfr(files,~read_excel(.x) %>% mutate(lab=.x))%>%mutate( 长度1=as.numeric(长度1),长度2=as.numeric(长度2),长度3=as.numeric(长度3), 长度4=as.numeric(长度4),长度5=as.numeric(长度5),长度6=as.numeric(长度6))%>% mutate(长度1=case_when(is.na(长度1)~0, TRUE~长度1),长度2=case_when(is.na(长度2)~0, TRUE~长度2),长度3=case_when(is.na(长度3)~0, TRUE~长度3), 长度4=case_when(is.na(长度4)~0, TRUE~长度4),长度5=case_when(is.na(长度5)~0, TRUE~长度5),长度6=case_when(is.na(长度6)~0, TRUE~长度6))%>% mutate(total=长度1+长度2+长度3+长度4+长度5+长度6)%>% mutate(result=case_when(total < 100~ "<100", total >=100&total<200 ~"100~200", total>=200&total<300~"200~300", total>=300&total<400~"300~400", total>=400&total<500~"400~500", total>=500&total<1000~"500~1000", total>=1000&total<5000~"1000~5000")) %>% count(result) %>% write.csv(.,"室内长度.csv")
时间: 2023-11-12 15:07:37 浏览: 62
这段代码有一些可以优化的地方,可以尝试以下几个方面进行优化:
1. 使用lapply代替map_dfr
2. 使用summarize代替mutate + count
3. 使用cut代替case_when
优化后的代码如下:
```
library(readxl)
library(dplyr)
files <- list.files(pattern = ".xlsx")
df_list <- lapply(files, function(x) {
read_excel(x) %>%
mutate(lab = x) %>%
mutate_at(vars(starts_with("长度")), ~ifelse(is.na(.), 0, as.numeric(.)))
})
df <- bind_rows(df_list)
df %>%
mutate(total = rowSums(select(., starts_with("长度")))) %>%
summarize(n = n(),
result = cut(total, breaks = c(-Inf, 100, 200, 300, 400, 500, 1000, 5000),
labels = c("<100", "100~200", "200~300", "300~400", "400~500", "500~1000", "1000~5000"))) %>%
group_by(result) %>%
summarize(count = n()) %>%
write.csv("室内长度.csv", row.names = FALSE)
```
这样做的好处是:
1. 使用lapply可以避免重复调用map_dfr造成的性能损失
2. 使用summarize代替mutate + count可以简化代码并提升性能
3. 使用cut可以简化case_when语句,并且更加灵活。同时我们还使用了group_by和summarize来完成数据的汇总,避免了使用count造成的性能损失。
阅读全文