Добавьте строку к каждому фрейму данных списка, содержащего средние значения определенных строк - PullRequest
1 голос
/ 29 марта 2020

У меня есть список фреймов данных с именем 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, кроме строк, которые имеют "Baseline" и "AASHTO" в именах столбцов. (Таким образом, только среднее значение строк с Sample1 по Sample10)

Наконец, я хотел бы установить в столбце Name имена строк каждого фрейма данных в my_list и удалить имена столбцов из всех фреймов данных в списке.

Ожидаемый результат для каждого кадра данных в 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        

Я очень ценю вашу помощь.

1 Ответ

2 голосов
/ 29 марта 2020

Мы можем l oop над list с lapply, получить colMeans столбцов «A», «B», исключая строки, где «Имена» являются «Базовыми» или «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")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...