r - 向列表的每个数据框添加一行,其中包含某些行的平均值
问题描述
我有一个名为 my_list 的数据框列表。下面是 my_list 中的数据框示例。
> print(df1)
A B Names
1 0.8262825 0.734412 Baseline
2 1.0100000 0.734412 Sample1
3 0.8262825 0.734412 Sample2
4 1.0100000 0.734412 Sample3
5 0.8262825 0.734412 Sample4
6 1.0100000 0.734412 Sample5
7 0.8262825 0.734412 Sample6
8 1.0100000 0.734412 Sample7
9 0.8262825 0.734412 Sample8
10 1.0100000 0.734412 Sample9
11 0.8262825 0.734412 Sample10
12 1.0100000 NA AASHTO
我想向 my_list 中的每个数据框添加一个新行,其中包含 A 列和 B 列的平均值,但列名称中具有“基线”和“AASHTO”的行除外。(所以只有 Sample1 到 Sample10 的行的平均值)
最后,我想将 Name 列设置为 my_list 中每个数据帧的行名,并从列表中的所有数据帧中删除列 Names。
my_list 中每个数据帧的预期结果是
A B
Baseline 0.8262825 0.734412
Sample1 1.0100000 0.734412
Sample2 0.8262825 0.734412
Sample3 1.0100000 0.734412
Sample4 0.8262825 0.734412
Sample5 1.0100000 0.734412
Sample6 0.8262825 0.734412
Sample7 1.0100000 0.734412
Sample8 0.8262825 0.734412
Sample9 1.0100000 0.734412
Sample10 0.8262825 0.734412
Mean 0.8156500 0.734412
AASHTO 1.0100000 NA
我真的很感谢你的帮助。
解决方案
我们可以遍历list
with lapply
,获取colMeans
列 'A'、'B' 的列,不包括 'Names' 为 'Baseline' 或 'AASHTO' 的行,然后rbind
使用原始数据集
lst2 <- lapply(lst1, function(x) {
means <- colMeans(x[!x$Names %in% c("Baseline", "AASHTO"),
c('A', 'B')], na.rm = TRUE)
d1 <- rbind(x, data.frame(Names = "Mean", as.list(means)))
row.names(d1) <- d1$Names
d1[setdiff(names(d1), "Names")]
})
或使用tidyverse
library(dplyr)
library(purrr)
library(tibble)
map(lst1, ~ .x %>%
add_row(Names = 'Mean',
A = mean(.$A[!.$Names %in% c("Baseline", "AASHTO")],
na.rm = TRUE),
B = mean(.$B[!.$Names %in% c("Baseline", "AASHTO")], na.rm = TRUE)) %>%
`row.names<-`(., NULL) %>%
column_to_rownames('Names'))
数据
lst1 <- list(structure(list(A = c(0.8262825, 1.01, 0.8262825, 1.01, 0.8262825,
1.01, 0.8262825, 1.01, 0.8262825, 1.01, 0.8262825, 1.01), B = c(0.734412,
0.734412, 0.734412, 0.734412, 0.734412, 0.734412, 0.734412, 0.734412,
0.734412, 0.734412, 0.734412, NA), Names = c("Baseline", "Sample1",
"Sample2", "Sample3", "Sample4", "Sample5", "Sample6", "Sample7",
"Sample8", "Sample9", "Sample10", "AASHTO")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")), structure(list(
A = c(0.8262825, 1.01, 0.8262825, 1.01, 0.8262825, 1.01,
0.8262825, 1.01, 0.8262825, 1.01, 0.8262825, 1.01), B = c(0.734412,
0.734412, 0.734412, 0.734412, 0.734412, 0.734412, 0.734412,
0.734412, 0.734412, 0.734412, 0.734412, NA), Names = c("Baseline",
"Sample1", "Sample2", "Sample3", "Sample4", "Sample5", "Sample6",
"Sample7", "Sample8", "Sample9", "Sample10", "AASHTO")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")))
推荐阅读
- paperjs - 从 paper.js 站点复制粘贴的代码到 codepen 不再工作
- android - 如何在android studio中递归生成颜色代码使用层次结构?
- spring-boot - 如何为 JPA Respository 扩展接口创建 bean(在多个模块中工作)
- rust - Rust 无法识别借用在循环结束时结束
- firebase - 从现有的云功能 Flutter 项目开始
- c# - BlockingCollection 中的多个消费者是否同时处理?
- javascript - Vue.js 在console.log 中看不到数据
- matplotlib - Jupyter notebook 中的交互式 matplotlib 与远程服务器上的 shell 命令“!python filename.py” ssh -i 访问
- sql - 在sql中分组后获取总百分比拆分
- mysql - 如果找不到数据,Mysql会添加临时列