【问题标题】:Add a row to each dataframe of the list containing mean values of certain rows向列表的每个数据框添加一行,其中包含某些行的平均值
【发布时间】:2020-03-29 19:57:26
【问题描述】:

我有一个名为 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        

非常感谢您的帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以用lapply循环list,得到'A'、'B'列的colMeans,不包括'Names'是'Baseline'或'AASHTO'的行,然后是@987654324 @与原始数据集

    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")))
    

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 2020-06-01
      • 2021-12-03
      • 1970-01-01
      • 2020-03-16
      • 2016-03-20
      • 2020-04-02
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多