R-在多个列上应用相同的函数

R-在多个列上应用相同的函数,r,dataframe,statistics,tapply,R,Dataframe,Statistics,Tapply,这是我第一次在这里问问题,我是R的初学者 我有一个巨大的数据集,我想从中获得基于类别的多列值的概述: sampleID|category|element_1|element_2|element_3|element_4| ---------------------------------------------------------- 1 | A | 12.53 | 46.17 | 94.09 | 25.23 | 2 | B | 19

这是我第一次在这里问问题,我是R的初学者

我有一个巨大的数据集,我想从中获得基于类别的多列值的概述:

sampleID|category|element_1|element_2|element_3|element_4|
----------------------------------------------------------
    1   |    A   |  12.53  |   46.17 |   94.09 |  25.23  |
    2   |    B   |  19.53  |   16.17 |   14.09 |  28.23  |
    3   |    C   |  21.53  |   56.17 |   24.09 |  26.23  |
    4   |    D   |  18.53  |   96.17 |   34.09 |  21.23  |
    5   |    B   |  17.53  |   76.17 |   44.09 |  24.23  |
    6   |    A   |  32.53  |   36.17 |   54.09 |  25.23  |
我一直在尝试的是通过每个类别获得每个元素的平均值,我一直在尝试的是关于R中的
tapply
函数:

tapply(data$element1, data$category, mean)
这给了我一个元素列很好的结果,但我似乎找不到一个答案,如何在所有列上都做到这一点,而不是手动在元素的每一列上做到这一点(按类别划分的元素1、元素2、元素3等的平均值)

我想要的是:

category | element_1| element_2| element_3 
     A   |   mean   |   mean   |   mean
     B   |   mean   |   mean   |   mean
     C   |   mean   |   mean   |   mean
我尝试了
apply
aggregate
的版本,但无法使其正常工作


任何意见是感激的,如果我需要提供更多的信息,请让我知道

如果只想聚合列,可以使用dplyr库

library(dplyr)
df = data.frame(sample_id = c(1,2,3,4),
                category = c("A", "B", "C", "A"),
                element1 = c(1,2,3,4),
                element2 = c(5,6,7,8),
                element3 = c(9,10,11,12))

summarise_if(df, is.numeric, mean)
或同等品

df %>% summarise_if(is.numeric, mean)

这将对每个数值列应用函数mean

如果您想了解更多信息,而不仅仅是平均值,您可以查看汇总统计数据

让我们创建一些示例数据:

library(tidyverse)
set.seed(1)

my_data <- as_tibble(matrix(runif(100), ncol = 10,
                            dimnames = list(rows = NULL,
                                            cols = paste0("Var_", 1:10))))

您可以从base(或从
Rfast
软件包的
matrixStats
中)使用
colMeans
函数

如果只想对数据的子集执行此操作,可以使用select函数

my_data %>%
  select(Var_1, Var_2) %>%
  colMeans
请注意,当您如上所述使用
colMeans
时,如果不首先只选择数值变量,它将抛出一个错误<代码>摘要仍然可以正常工作

编辑:

考虑到你的评论并重新阅读你的(更新的)问题,这可能更接近你想要的

library(tidyverse)

set.seed(1)

data <- tibble(
  sampleID = 1:6,
  category = c("A", "B", "C", "D", "B", "A"),
  element_1 = runif(6)*10,
  element_2 = runif(6)*10,
  element_3 = runif(6)*10,
  element_4 = runif(6)*10
  )
这将提供所需的输出:

  category sampleID element_1 element_2 element_3 element_4
  <chr>       <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
1 A             3.5      5.52     8.78       6.26      5.77
2 B             3.5      5.80     7.29       3.69      4.87
3 C             3        3.77     6.16       2.02      1.51
4 D             4        4.78     0.510      5.02      4.79
category sampleID元素\u 1元素\u 2元素\u 3元素\u 4
1 A 3.5 5.52 8.78 6.26 5.77
2 B 3.5 5.80 7.29 3.69 4.87
3 C 3.77 6.16 2.02 1.51
4 D 4.78 0.510 5.02 4.79

您能分享一下您的数据样本和您想要的输出吗?我只是想确定你在找什么!得到摘要和平均值是很好的,我以前为每个专栏都这样做过!问题是根据列类别的值获取列平均值:即a类、B类和C类元素_1的平均值!这就是为什么我尝试使用tapply,但它一次只能在一列上工作(不能同时在元素1-element上工作)。你是对的。我又看了一眼你的问题,编辑了答案。我把原来的答案留在那里了,但编辑后的一切都是:应该是你要找的。如果没有,请让我知道我在哪里误解你。谢谢!这正是我想要的!
library(tidyverse)

set.seed(1)

data <- tibble(
  sampleID = 1:6,
  category = c("A", "B", "C", "D", "B", "A"),
  element_1 = runif(6)*10,
  element_2 = runif(6)*10,
  element_3 = runif(6)*10,
  element_4 = runif(6)*10
  )
# A tibble: 6 x 6
  sampleID category element_1 element_2 element_3 element_4
     <int> <chr>        <dbl>     <dbl>     <dbl>     <dbl>
1        1 A             4.97     7.80       2.52      5.06
2        2 B             9.93     7.62       4.23      7.16
3        3 C             3.77     6.16       2.02      1.51
4        4 D             4.78     0.510      5.02      4.79
5        5 B             1.67     6.96       3.14      2.58
6        6 A             6.07     9.76       9.99      6.47
data %>%
  group_by(category) %>%
  summarize_if(is.numeric, mean)
  category sampleID element_1 element_2 element_3 element_4
  <chr>       <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
1 A             3.5      5.52     8.78       6.26      5.77
2 B             3.5      5.80     7.29       3.69      4.87
3 C             3        3.77     6.16       2.02      1.51
4 D             4        4.78     0.510      5.02      4.79