在 R 中按行名 (dplyr) 汇总样本观察结果
Aggregate observations across samples by rownames (dplyr) in R
阿罗哈,
我正在尝试获取样本矩阵中每一行名称的总计数。出于某种原因,我尝试了 rowsum 然后转换为数据框并使用 dplyr::group_by 但它们给出了错误。这是示例数据的一个子集:
mat = matrix(c(0,1,2,3,4), nrow=3, ncol = 5)
rownames(mat) <- c("CHO", "NO", "O")
colnames(mat) <- c("sample_1", "sample_2", "sample_3", "sample_4", "sample_5")`
我想要一个带有公式名称的结果数据框,然后总体上观察到样本间观察值的总和和样本公式的百分比。
这看起来很简单,但我已经尝试了所有不同的组合来聚合数据,但都无济于事,非常感谢您提供一些指导。
我们可能只需要rowSums
rowSums(mat)
如果有重复的行名(在示例数据中,行名是唯一的),那么我们使用 rowsum
并将 group
指定为 rownames
rowsum(mat, row.names(mat))
然后我们在上面使用 rowSums
rowSums(rowsum(mat, row.names(mat)))
@akrun 的回答完全符合发帖人的要求,但我发现自己处于类似但略有不同的情况 很多,但数据框具有以下内容矩阵中的重复行名,因此这些现在是列中的值(下面称为“复合”),如下所示:
set.seed(2347813)
df <- data.frame(matrix(sample(c(0,1,2,3,4,5,6,7,8,9),
size=30, replace=T), nrow=6, ncol=5))
colnames(df) <- c("sample_1", "sample_2", "sample_3", "sample_4", "sample_5")
df$compound <- c("CHO", "NO", "O", "CHO", "NO", "O")
看起来像:
sample_1 sample_2 sample_3 sample_4 sample_5 compound
1 0 1 4 9 1 CHO
2 3 8 3 0 5 NO
3 8 9 7 1 7 O
4 8 2 9 7 7 CHO
5 3 8 9 0 5 NO
6 6 1 6 7 5 O
然后我想以各种方式总结数据,但我想按化合物对其进行分组,并使用来自 dplyr/tidyverse.
的管道(下面的 %>%
)
就像原来的问题一样,如果我们想要化合物的总数,我们会做:
df %>%
group_by(compound) %>%
summarize(total=sum(c_across(starts_with("sample"))))
这会给我们:
compound total
<chr> <dbl>
1 CHO 48
2 NO 44
3 O 57
但我认为最好的部分是能够同时执行多个汇总操作。假设我们想要总计、均值、标准差和仅 sample_1 到 sample_3 的均值,我们可以在一个管道命令中获得所有内容:
df %>%
group_by(compound) %>%
summarize(total=sum(c_across(starts_with("sample"))),
grand_mean=mean(c_across(starts_with("sample"))),
sd=sd(c_across(starts_with("sample"))),
mean_13=mean(c_across(sample_1:sample_3))) # mean of sample 1-3
这给了我们:
# A tibble: 3 x 5
compound total grand_mean sd mean_13
<chr> <dbl> <dbl> <dbl> <dbl>
1 CHO 48 4.8 3.58 4
2 NO 44 4.4 3.20 5.67
3 O 57 5.7 2.71 6.17
组合管道(%>%
)、group_by
、mutate
和新版本的across
(上面我使用了c_across
)你可以得到一气呵成。
阿罗哈,
我正在尝试获取样本矩阵中每一行名称的总计数。出于某种原因,我尝试了 rowsum 然后转换为数据框并使用 dplyr::group_by 但它们给出了错误。这是示例数据的一个子集:
mat = matrix(c(0,1,2,3,4), nrow=3, ncol = 5)
rownames(mat) <- c("CHO", "NO", "O")
colnames(mat) <- c("sample_1", "sample_2", "sample_3", "sample_4", "sample_5")`
我想要一个带有公式名称的结果数据框,然后总体上观察到样本间观察值的总和和样本公式的百分比。
这看起来很简单,但我已经尝试了所有不同的组合来聚合数据,但都无济于事,非常感谢您提供一些指导。
我们可能只需要rowSums
rowSums(mat)
如果有重复的行名(在示例数据中,行名是唯一的),那么我们使用 rowsum
并将 group
指定为 rownames
rowsum(mat, row.names(mat))
然后我们在上面使用 rowSums
rowSums(rowsum(mat, row.names(mat)))
@akrun 的回答完全符合发帖人的要求,但我发现自己处于类似但略有不同的情况 很多,但数据框具有以下内容矩阵中的重复行名,因此这些现在是列中的值(下面称为“复合”),如下所示:
set.seed(2347813)
df <- data.frame(matrix(sample(c(0,1,2,3,4,5,6,7,8,9),
size=30, replace=T), nrow=6, ncol=5))
colnames(df) <- c("sample_1", "sample_2", "sample_3", "sample_4", "sample_5")
df$compound <- c("CHO", "NO", "O", "CHO", "NO", "O")
看起来像:
sample_1 sample_2 sample_3 sample_4 sample_5 compound
1 0 1 4 9 1 CHO
2 3 8 3 0 5 NO
3 8 9 7 1 7 O
4 8 2 9 7 7 CHO
5 3 8 9 0 5 NO
6 6 1 6 7 5 O
然后我想以各种方式总结数据,但我想按化合物对其进行分组,并使用来自 dplyr/tidyverse.
的管道(下面的 %>%
)
就像原来的问题一样,如果我们想要化合物的总数,我们会做:
df %>%
group_by(compound) %>%
summarize(total=sum(c_across(starts_with("sample"))))
这会给我们:
compound total
<chr> <dbl>
1 CHO 48
2 NO 44
3 O 57
但我认为最好的部分是能够同时执行多个汇总操作。假设我们想要总计、均值、标准差和仅 sample_1 到 sample_3 的均值,我们可以在一个管道命令中获得所有内容:
df %>%
group_by(compound) %>%
summarize(total=sum(c_across(starts_with("sample"))),
grand_mean=mean(c_across(starts_with("sample"))),
sd=sd(c_across(starts_with("sample"))),
mean_13=mean(c_across(sample_1:sample_3))) # mean of sample 1-3
这给了我们:
# A tibble: 3 x 5
compound total grand_mean sd mean_13
<chr> <dbl> <dbl> <dbl> <dbl>
1 CHO 48 4.8 3.58 4
2 NO 44 4.4 3.20 5.67
3 O 57 5.7 2.71 6.17
组合管道(%>%
)、group_by
、mutate
和新版本的across
(上面我使用了c_across
)你可以得到一气呵成。