Coronin
,Dystrophin
,Tubulin
(随机使用Google标记的蛋白质名称),等等。 所以我们有一个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”等的事实。
答案 0 :(得分:0)
一种选择是按列名进行拆分,将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
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)))))