r - 如果并非所有列都存在于所有文件中,如何计算列的平均值?

标签 r dataframe dplyr data.table

我有多个文本文件,包含各个列。我只想要每组文件中可能存在也可能不存在的几列的平均值。

我正在使用以下代码来计算所选列的平均值。我面临的问题是并非所有文件都包含所有列。例如,文件夹 1 中的文件具有所有列,文件夹 2 中的文件具有 C1、C2、C8、C9 列,文件夹 3 中的文件具有 C1、C2、C5 列等。

由于这个原因,它只为包含所有列的文件夹 1 生成输出,并为文件夹 2 和 3 给出错误,指出未找到列(不存在于各自的文件夹中)。

我希望代码应该以这样的方式运行:如果文件包含 cn 中所选列中的任何列,则应在输出中计算其平均值,而不会给出 cn 中提到的其他列不会出现的任何错误存在于文件中。

代码:

merged <- rbindlist(dt.tidied, fill = TRUE, use.names = TRUE)

cn <- c('Date/Time', 'C1 (C1)', 'C2 (C2)', 'C5 (C5)', 'C8 (C8)', 'C9 (C9)', 'C10 (C10)')

abc <- merged[, ..cn] %>%
 as_tibble() %>%
 group_by(Time_sp = lubridate::floor_date(`Date/Time`, "5 mins")) %>% 
 summarise(across(where(is.numeric), ~ if(mean(is.na(.x)) > 0.5) NA else mean(.x, na.rm = 
                                                                               TRUE)))

write.csv(abc, paste0(dirlist[idx],"_mean.csv"), row.names = FALSE)

最佳答案

merged <- rbindlist(dt.tidied, fill = TRUE, use.names = TRUE)

cn <- c('Date/Time', 'C1 (C1)', 'C2 (C2)', 'C5 (C5)', 'C8 (C8)', 'C9 (C9)', 'C10 (C10)')

merged %>%
 select(any_of(cn)) %>%
 as_tibble() %>%
 group_by(Time_sp = lubridate::floor_date(`Date/Time`, "5 mins")) %>% 
 summarise(across(where(is.numeric),
           ~ ifelse(mean(is.na(.x)) > 0.5), NA, mean(.x, na.rm = TRUE ))) -> abc

write.csv(abc, paste0(dirlist[idx],"_mean.csv"), row.names = FALSE)

关于r - 如果并非所有列都存在于所有文件中,如何计算列的平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76347886/

相关文章:

java - 保留:连接被拒绝:连接

r - 更改日期的打印格式而不将其转换为字符

python - 如何通过 yfinance 下载数据修复此错误

使用应用族或循环复制 dplyr 管道结构

r - group_by() summarise() 和权重百分比 - R

r - 跨密度图 X 轴的意外线 (r)

R:如何找到向量的众数

r - 如何使用 magrittr 从数据框中提取单个元素?

python - 将python中的RDa文件作为 Pandas 数据框读取

python - 给定数据框中的 pd.Interval 列,过滤落在 Interval 范围内的值