R tibble: агрегирование по строкам по конкретным столбцам, по группам столбцов - PullRequest
0 голосов
/ 06 июня 2019

У меня есть данные об уровнях биологических соединений у тестируемых пациентов, которые группируются в разные группы в зависимости от того, какие лекарства вводили.То есть у нас есть:

  • Столбцы: Лекарства (или группы) A, B и C, где в каждой группе 3 пациента (индивидуально обозначенных, где пациенты в A обозначены A1, A2, A3;пациенты в группе B обозначаются как B1, B2, B3 и т. д.)
  • Строки: мы отслеживаем биологические соединения Coronin, Dystrophin, Tubulin (случайно выбранные названия белков Googled) и т. д.,

Таким образом, мы имеем tibble подобный (все значения в tibble являются числами с плавающей запятой):

| compound  | A1 | A2 | A3 | B1 ... C3|
|-----------|----|----|----|---- ... --|
| Coronin   |
| Dystrophin|
| Gloverin  |
| keratin   |
| Tubulin   |

Для каждого соединения я хочу вычислить средние значения для каждогогруппа, как новый столбец, например:

| compound  | A1 | A2 | A3 | B1 ...C3| mean_A | mean_B | mean_C |
|-----------|-----|-----|-----|---- ... --|---------|---------|---------|
| Coronin   |  1  |  2  |  3  |     ...   |    2    |  ...              |
| Dystrophin|  4  |  5  |  6  |     ...   |    5    |  ...              |
| Gloverin  |  ...
| keratin   |
| Tubulin   |

Код для этого:

my_tibble <- my_tibble %>% 
  mutate(mean_A = rowMeans(select(., c("A1", "A2", "A3")))) %>%
  mutate(mean_B = rowMeans(select(., c("B1", "B2", "B3")))) %>%
  mutate(mean_C = rowMeans(select(., c("C1", "C2", "C3"))))

Вопрос: я хотел бы иметь возможность это длядинамически вводить число групп, т. е. C, D, E и т. д. ... где столбец в группу представляет собой отдельный вклад пользователя, сам по себе, скажем:

| group_name | name1 | name2 | name3 |
|------------|-------|-------|-------|
|      A     |  A1   |  B2   |  C3   |
|      B     |  B1   |  B2   |  C3   |
...
and so on

Как можно добавить итеративноmutate глаголов, в соответствии с указанным пользователем числом групп (и связанных имен выборки в группу)?

Примечание: имена групп "C", "B" ... и т. Д. Являются произвольными (группам, например, скорее всего будет назначено название препарата, которому была назначена эта группа), поэтому я бы не стал использовать итеративную операцию, основанную на том факте, что они буквально называются «А», «В»,и т. д.

1 Ответ

0 голосов
/ 06 июня 2019

Можно было бы разделить имена столбцов, пройти по list с помощью sapply, получить rowMeans и назначить его 3 новым столбцам

nm1 <- substr(names(df1)[-1], 1, nchar(names(df1)[-1])-1)  
df1[paste0("mean_", toupper(unique(nm1)))] <- 
            sapply(split.default(df1[-1], nm1), rowMeans)

df1
#  compound g11 g12 g13 g21 g22 g23 g31 g32 g33  mean_G1  mean_G2  mean_G3
#1        A   7   3   9   8   8   1   3   7   2 6.333333 5.666667 4.000000
#2        B   3   8   8   1   2   5   1   1   4 6.333333 2.666667 2.000000
#3        C   8   6   7   5   1   4   3   6   3 7.000000 3.333333 4.000000
#4        D   7   9   8   5   5   6   8   7   6 8.000000 5.333333 7.000000
#5        E   2   4   1   5   2   6   6   1   3 2.333333 4.333333 3.333333

ПРИМЕЧАНИЕ.распространяться на любое количество групп.Единственное, что нужно изменить, это 1:3 в текущем примере для создания имен столбцов

data

set.seed(24)
df1 <- cbind(compound = LETTERS[1:5], as.data.frame(matrix(sample(1:9, 5 * 9,
      replace = TRUE), nrow = 5, ncol = 9, dimnames = list(NULL,
        paste0(rep(paste0("g", 1:3), each = 3), 1:3)))))
...