帮我优化这段代码map_dfr(c("smoke","drink","obesity"), ~ dat1 <- data %>% filter(get(.x) == 1) %>% count(year,sex,agegroup,cancer)
时间: 2023-11-01 16:01:51 浏览: 75
可以尝试使用管道符 `%>%` 将操作串起来,避免多次赋值。同时,可以将函数 `count()` 的参数列表放在新的一行,使代码更加清晰易读。
```R
library(dplyr)
library(purrr)
dat1 <- data %>%
map_dfr(c("smoke", "drink", "obesity"), ~ {
filter(.data, !!sym(.x) == 1) %>%
count(
year,
sex,
agegroup,
cancer
)
})
```
这段代码中使用了 `sym()` 函数将字符串转换为符号,避免使用 `get()` 函数。同时,使用了 `map_dfr()` 函数来统一处理三个不同的数据列。
相关问题
帮我优化这段代码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")
这段代码有一些可以优化的地方,可以尝试以下几个方面进行优化:
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造成的性能损失。
Error in map_dfr(all_files, read_tsv) : 没有"map_dfr"这个函数 >
看起来你在尝试使用的`map_dfr`函数在你的R环境中可能不存在。这是因为在最新版本的`purrr`包中,`map_dfr`已经被替换成了`map_df`。如果你想要用`dplyr`来合并数据,可以这样操作:
1. 首先确认你已经安装了`purrr`和`dplyr`,如果没有,可以用以下命令安装:
```R
install.packages("purrr")
install.packages("dplyr")
```
2. 读取文件列表并存储每个文件的内容,可以使用`list.files`和`lapply`:
```R
all_files <- list.files(pattern = "*.rna_seq.augmented_star_gene_counts.tsv", full.names = TRUE)
data_frames <- lapply(all_files, read_tsv)
```
3. 然后使用`bind_rows`从`data.table`或`dplyr`包结合所有的数据帧:
```R
combined_data <- do.call(rbind, data_frames)
```
或者使用`reduce`和`bind_rows`:
```R
combined_data <- Reduce(function(x, y) bind_rows(x, y), data_frames)
```
4. 如果需要分组后再合并,可以添加额外的`group_by`和`ungroup`步骤。
请注意检查你的R版本以及所使用的包是否是最新的,并确保你在正确的包里找到了对应的功能。
阅读全文