簡體   English   中英

R tibble:按列組按特定列的行聚合

[英]R tibble: aggregating by row across specific columns, by column groups

我有測試患者的生物化合物水平的數據,根據給予某些葯物,他們被分成不同的組。 也就是說,我們有:

  • 列:葯物(或組)A,B和C,其中每組有3名患者(分別表示A中的患者表示為A1,A2,A3; B中的患者表示為B1,B2,B3等。 )
  • 行:我們正在監測生物化合物CoroninDystrophinTubulin (隨機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”......等是任意的(例如,這些組可能被分配了給予該組的葯物的名稱),所以我不會使用迭代依賴於它們字面上命名為“A”,“B”等事實的操作。

一個選項是按列名分割,用sapply遍歷list ,獲取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

數據

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM