R - Применение одной и той же функции к нескольким столбцам - PullRequest
1 голос
/ 23 октября 2019

Я впервые задаю вопрос здесь, и я новичок в 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  |

То, что я пытался сделать, - это получить среднее значение каждого элемента по каждой категории, в основном я пытался разобраться с функцией tapply в R:

tapply(data$element1, data$category, mean)

Это дает хорошие результаты для одного столбца элемента, но я не могу найти ответ, как это сделать для всех столбцов, не делая это вручную для каждого столбца элементов (среднее для element1, element2, element3 и т. Д. по категориям).

Я хочу вот что:

category | element_1| element_2| element_3 
     A   |   mean   |   mean   |   mean
     B   |   mean   |   mean   |   mean
     C   |   mean   |   mean   |   mean

Я пробовал версии apply и aggregate, но не могу заставить его работать.

Любой совет приветствуется, если мне нужно предоставить больше информации, пожалуйста, дайте мне знать!

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Если вы хотите агрегировать только столбцы, вы можете использовать библиотеку 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)

Это будет применять среднее значение функции к каждому числовому столбцу,

0 голосов
/ 23 октября 2019

Если вам нужно больше информации, чем просто среднее значение, вы можете посмотреть сводную статистику.

Давайте создадим несколько примеров данных:

library(tidyverse)
set.seed(1)

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

Теперь мы можем увидеть полное резюместатистику, используя только сводку:

summary(my_data)

# Alternatively 
my_data %>%
  summary

Вы можете использовать функцию colMeans из базы (или из matrixStats из Rfast пакетов).

my_data %>%
  colMeans

Если выВы хотите использовать это только для подмножества ваших данных. Вы можете использовать функцию выбора

my_data %>%
  select(Var_1, Var_2) %>%
  colMeans

. Обратите внимание, что при использовании colMeans, как указано выше, без предварительного выбора только числовых переменных, будет выброшеноошибка. summary все равно будет работать без проблем.

РЕДАКТИРОВАТЬ:

Принимая во внимание ваш комментарий и перечитывая (обновленный) вопрос, это может быть ближе к тому, что вы ищете.

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

Теперь мы можем просто сделать небольшое изменение и использовать функцию group_by()

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
...