我有一個這樣的資料框:
Feature ID Sub Value
A T1 B1 5.87
B T1 B2 3.99
C T1 B3 12.57
A T1 B2 9.22
B T1 B3 7.89
C T1 B1 4.76
A T2 B1 4.56
B T2 B2 9.26
C T2 B2 7.44
我想要做的是在這個資料集中運行一個因子 ANOVA,因子是“Sub”。我想遍歷每個功能并遍歷每個 ID。基本上,我正在計算一個 ID 中每個特征的方差,在“Sub”之間。
我已經生成了下面的代碼,但它似乎不起作用。
datalist = list()
for (i in unique(data1$Feature)) {
for (j in unique(data1$ID)) {
A1 <- summary(aov(data1$value ~ as.factor(data1$Sub), data = data1))
datalist[[j]] <- A1
}
}
big_data = do.call(rbind, datalist)
我最終得到了 big_data,它是一個包含 36 個串列的矩陣。我無法訪問 Anova 輸出。它不一定是資料框。即使回圈中的“write.csv()”會生成不同的輸出。最終,我只需要 Anova 輸出的“之間”因子引數來生成一個圖,所以如果這也可以合并到代碼中,那將會有很大幫助。
我仍然是 R 的初學者,非常感謝任何幫助。
謝謝!
uj5u.com熱心網友回復:
當前設定的幾個問題:
您實際上并未在呼叫中使用
iand ,因此所有嵌套回圈迭代都將回傳在整個資料幀上運行的完全相同的結果。快速修復:第 i 個和第 j 個值的資料幀。janovaforsubsetanova(value ~ Sub, data = subset(data1, Feature == i & ID == j))您只在
j值下保存串列元素,而不是同時保存i和j,因此迭代將重復重新分配并且只保存最后一次傳遞的j專案。快速修復:添加第 i 個和第 j 個值的命名元素。datalist[[paste0(i, "_", j)]] <- A1您正在嘗試
rbind列出物件,而不是矩陣或資料框,因為summary.anova回傳結果串列。對于您的用例,呼叫str顯示您的結果包含 1 的串列:str(summary(aov(data1$value ~ as.factor(data1$Sub), data = data1))) List of 1 $ :Classes ‘anova’ and 'data.frame': 2 obs. of 5 variables: ..$ Df : num [1:2] ... ..$ Sum Sq : num [1:2] ... ..$ Mean Sq: num [1:2] ... ..$ F value: num [1:2] ... ..$ Pr(>F) : num [1:2] ... - attr(*, "class")= chr [1:2] "summary.aov" "listof"快速修復:索引第一項。
summary(anova(...))[[1]]
但是,請考慮使用(面向物件的包裝器)的應用系列解決方案,并避免初始化串列的簿記并在嵌套回圈中迭代分配。具體來說,可以將資料幀分成一個或多個組,并對子集運行操作以回傳一個串列,該串列等于組的所有可能的唯一值。此外,考慮使用定義的方法來封裝每個子集上的所有處理。bytapplyforby
# USER-DEFINED METHOD
run_anova <- function(sub_df) {
# RAW RESULTS
anova_raw <- summary(aov(value ~ Sub, data = sub_df))[[1]]
# CLEAN UP DATA WITH IDENTIFIERS
anova_df <- data.frame(
within(anova_raw, {Feature <- sub_df$Feature[1]; ID <- sub_df$ID[1]}),
row.names = NULL,
check.names = FALSE
)
return(anova_df)
}
datalist <- by(data1, data1[c("Feature", "ID")], run_anova)
big_data <- do.call(rbind, unname(datalist))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/368649.html
