2014-04-13 104 views
0

我想通過名稱在數據框中找到重複的樣本,然後計算它們的平均值。但首先,樣本名稱的平等測試不起作用(或'串聯',我不確定,因爲使用print()和write.table進行調試沒有幫助。)。我究竟做錯了什麼?R中數據幀的兩列標題的平等測試

我的數據表有20531行和1155列,我想要得到每行重複列的平均值。我測試了代碼(第一列標題是'基因ID',所以我跳過了dfs [,1],在平等測試後,我嘗試將目標列連接到一個數據框):

dfs <- as.data.frame(dfs) 
for(i in 2:ncol(dfs)) { 
    oneOftheSamples <- data.frame(dfs[,i]) 
    colnames(oneOftheSamples) <- colnames(dfs)[i] 
    head(oneOftheSamples) 
    wantedcolname <- colnames(oneOftheSamples) 
    n <- i 
    for (j in n:ncol(dfs)){ 
    foundcolname <- colnames(dfs)[j] 
    if((wantedcolname==foundcolname) & (j!=i)){ 
     repOftheSample <- data.frame(dfs[,j]) 
     colnames(repOftheSample) <- colnames(dfs)[j] 
     oneOftheSamples <- data.frame(oneOftheSamples,repOftheSample) 
    } 
    } 
} 

任何提示或意見可能是有用的,在此先感謝!

回答

0

一個提示將是下次分享你​​的數據。我不能找出你的循環是應該做的,但基於你的帖子,你這是怎麼能拿重複列

set.seed(1618) 
dat <- matrix(rpois(100, 1), ncol = 10) 
colnames(dat) <- sample(LETTERS[1:5], 10, replace = TRUE) 
dat <- as.data.frame(dat, check.names = FALSE) 

# A B D E A B B C E B 
# 1 0 2 0 2 3 1 0 0 3 0 
# 2 1 1 0 1 0 1 0 0 2 1 
# 3 0 0 2 0 0 1 4 1 3 0 
# 4 1 0 0 0 0 2 0 2 0 1 
# 5 0 1 0 1 0 2 0 2 0 1 
# 6 1 0 2 1 1 1 1 0 1 0 
# 7 1 1 1 0 1 1 1 1 0 0 
# 8 0 1 1 1 1 0 1 1 0 0 
# 9 0 1 1 1 1 2 0 1 0 0 
# 10 0 1 0 2 1 0 0 2 0 1 

一些列的被複制兩個以上的平均次,所以我只希望那些獨特

(dups <- unique(names(dat)[duplicated(names(dat))])) 
# [1] "A" "B" "E" 
dat.list <- lapply(dups, function(x) dat[names(dat) %in% x]) 
# list of three 

我猜你想要的一行意味着每個

dat1 <- sapply(1:length(dat.list), function(x) 
    apply(dat.list[[x]], 1, mean)) 
colnames(dat1) <- dups 

as.data.frame(dat1) 
#  A B E 
# 1 1.5 0.75 2.5 
# 2 0.5 0.75 1.5 
# 3 0.0 1.25 1.5 
# 4 0.5 0.75 0.0 
# 5 0.0 1.00 0.5 
# 6 1.0 0.50 1.0 
# 7 1.0 0.75 0.0 
# 8 0.5 0.50 0.5 
# 9 0.5 0.75 0.5 
# 10 0.5 0.50 1.0 
+0

對不起,我將修改我的答案與我的數據立即描述。我對R編程完全陌生,但有一點C++的經驗,所以我可能看起來像一個關於R數據結構的小虛擬。 無論如何,我理解你的代碼(至少我認爲),但它執行的方式與我的完整腳本相同: 「dfs.list [[x]]中的錯誤:下標越界 調用:sapply - > sapply - > lapply - > FUN - > apply「 我不認爲我試圖從邊界訪問數組。我試圖弄清楚我搞砸了。 感謝您的回覆! – szusz

+0

我不認爲你有完全重複的列名稱。如果您將replace = TRUE更改爲FALSE以上,則沒有重複項,並且可以重現您的錯誤。當你用'read.table'或類似的東西讀取數據時,你有重複的colnames,你需要使用'check.names = FALSE';否則,雙絞線將被編碼爲「A,A.1,A.2」等。對於您的數據,「dups」或「dat.list」的長度是多少?如果它是零,那是你的問題。另外,我只是用一個數據框來運行上面的代碼,並在幾分鐘內在我的筆記本電腦上完成,所以您不應該有任何問題。 – rawr

+0

謝謝,它幫了很多,我修好了!我使用read.columns而不是read.table(我必須從多個文件中讀取指定的列),並且在此函數中不能設置'check.names'參數,但現在我重寫了我的代碼。 – szusz