计算特定行的平均值

Calculate the mean of specific rows

我有一个包含 10 行(样本)的数据,它们是 Class1Class2 和列。

我想计算行的平均值 Class1 并将结果放在第 11 行并计算行的平均值 Class2 并将结果放在第 12 行。

数据:

Name   ClassType   Col1   Col2   Col3
A      Class1       10     50    12
B      Class2        7     20    12
C      Class1        8     12     8
D      Class1        9     14    17
E      Class2        3     15    14
F      Class2       10     15    16
G      Class2       12     22    15
H      Class1       10     28    10

我想要的结果:

       Name   ClassType    Col1   Col2   Col3     
        A      Class1       10     50    12        
        B      Class2        7     20    12
        C      Class1        8     12     8
        D      Class1        9     14    17
        E      Class2        3     15    14
        F      Class2       10     15    16
        G      Class2       12     22    15
        H      Class1       10     28    10
 Mean class1    NA          9.25   26    11.75
 Mean class2    NA          8      18    14.25

试试这个

library(dplyr)

calc_cols <- your_dataframe %>% group_by(ClassType) %>%
   summarise( Col1 = mean(Col1),
              Col2 = mean(Col2),
              Col3 = mean(Col3)) %>%
   mutate( ClassType = NA,
           Name = c("Mean class1", "Mean class2"))

your_new_dataframe <- rbind(your_dataframe,  calc_cols)    

您可以跨列汇总。以@geometricfreedom 的回答为基础,方法如下(我仅使用前四行创建了您的数据集的迷你版本):

your_data <- data.frame(
  Name = c("A", "B", "C", "D"), 
  ClassType = c("Class1", "Class2", "Class1", "Class1"), 
  Col1 = c(10, 7, 8, 9), 
  Col2 = c(50, 20, 12, 14),
  Col3 = c(12, 12, 8, 17)
)

calc_cols <- your_data %>% 
  group_by(ClassType) %>% 
  summarize(
    across(Col1:Col3, mean)
  ) %>% 
  mutate(ClassType = NA, Name = c("Mean Class 1", "Mean Class 2"))

your_data <- rbind(your_data, calc_cols)

your_data

这是另一个 tidyverse 选项,但在一个管道中完成所有操作。我们可以先按 ClassType 分组,然后 summarize 对以 Col 开头的任何列进行分组。此外,在 summarize 语句中,我们可以为底行创建您想要的其他名称(即 Mean Class 1Mean Class 2),而只是 return NA 对于 ClassType。然后,我们可以使用 bind_rows 将原始输入数据帧绑定到上一步中的新输入数据帧(由 . 表示)。

df %>%
  group_by(ClassType) %>%
  summarize(Name = paste0("Mean ", unique(ClassType)),
            across(starts_with("Col"), mean),
            ClassType = NA) %>%
  bind_rows(df, .)

输出

          Name ClassType  Col1 Col2  Col3
1            A    Class1 10.00   50 12.00
2            B    Class2  7.00   20 12.00
3            C    Class1  8.00   12  8.00
4            D    Class1  9.00   14 17.00
5            E    Class2  3.00   15 14.00
6            F    Class2 10.00   15 16.00
7            G    Class2 12.00   22 15.00
8            H    Class1 10.00   28 10.00
9  Mean Class1      <NA>  9.25   26 11.75
10 Mean Class2      <NA>  8.00   18 14.25

数据

df <- structure(
  list(
    Name = c("A", "B", "C", "D", "E", "F", "G", "H"),
    ClassType = c(
      "Class1",
      "Class2",
      "Class1",
      "Class1",
      "Class2",
      "Class2",
      "Class2",
      "Class1"
    ),
    Col1 = c(10L, 7L, 8L, 9L, 3L,
             10L, 12L, 10L),
    Col2 = c(50L, 20L, 12L, 14L, 15L, 15L, 22L, 28L),
    Col3 = c(12L, 12L, 8L, 17L, 14L, 16L, 15L, 10L)
  ),
  class = "data.frame",
  row.names = c(NA,-8L)
)

试试这个!

import pandas as pd 

mean_col1 = data[Col1].mean() 
mean_col2 = data[Col2].mean()

data.loc[len(data.index)] = [None, mean_col1, mean_col2, None]