[英]R - Applying same function on multiple columns
這是我第一次在這里提問,我是 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 |
我一直在嘗試做的是按每個類別獲取每個元素的平均值,我一直在嘗試的是圍繞 R 中的tapply
function 的事情:
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
的版本,但無法使其正常工作。
任何建議表示贊賞,如果我需要提供更多信息,請告訴我!
如果您只想聚合列,可以使用 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)
這會將 function 均值應用於每個數字列。
如果您想要更多信息而不僅僅是平均值,您可以查看匯總統計信息。
讓我們創建一些示例數據:
library(tidyverse)
set.seed(1)
my_data <- as_tibble(matrix(runif(100), ncol = 10,
dimnames = list(rows = NULL,
cols = paste0("Var_", 1:10))))
現在,我們可以通過使用 summary 來查看完整的匯總統計信息:
summary(my_data)
# Alternatively
my_data %>%
summary
您可以使用來自 base(或來自colMeans
包的 matrixStats)的matrixStats
Rfast
。
my_data %>%
colMeans
如果您只想對數據的子集執行此操作,則可以使用 select function
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()
function
data %>%
group_by(category) %>%
summarize_if(is.numeric, mean)
這將給出所需的 output:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.