2011-06-13 69 views
1

我有一個數據幀,看起來像這樣如何重複R中執行的函數多次

DF:

V1 V2   V3 V4 V5 V6 V7 V8  
0 ss66369915 0 0 G A A A 
0 ss66112992 0 0 A A A A 
0 ss66369329 0 0 A A A A 
0 ss66368644 0 0 A A A A 
0 ss66368284 0 0 A A G A 
0 ss66126380 0 0 A G A G 
0 ss66407282 0 0 A A A A 
0 ss66405035 0 0 A A A A 
0 ss66405148 0 0 G G A G 
0 ss66405271 0 0 G G G G 

在V6列通過V9的數據是雙等位基因的基因型,所以我想將每兩列合併爲一個。

例如,它看起來像:

V1 V2   V3 V4 V5_V6 V7 V8  
0 ss66369915 0 0 GA A A 
0 ss66112992 0 0 AA A A 
0 ss66369329 0 0 AA A A 
0 ss66368644 0 0 AA A A 
0 ss66368284 0 0 AA G A 
0 ss66126380 0 0 AG A G 
0 ss66407282 0 0 AA A A 
0 ss66405035 0 0 AA A A 
0 ss66405148 0 0 GG A G 
0 ss66405271 0 0 GG G G 

我能做到這一點使用:

DF$V5_V6=paste(DF$V5, DF$V6, sep="") 

or 

within(DF, V5_V6 <- paste(V5, V6, sep='')) 

但是我的實際數據幀由4776行,我會每兩合併列從第5列開始到第4776列。

我想知道如何在沒有手動操作的情況下實現這一點。我試圖使用for循環沒有成功。我很新使用R.

謝謝!

回答

1

也許你可以顯示你嘗試過的循環?

下面是一個使用循環的方法,該循環應該做你想做的事,如果我明白你想要什麼。具體來說 - 這個for循環會將列的值粘貼在一起。我們使用names()函數來提取相關的列名並將它們粘貼在一起。我們使用[來索引創建的對象newdat

#read in data 
txt <- "V1 V2   V3 V4 V5 V6 V7 V8  
0 ss66369915 0 0 G A A A 
0 ss66112992 0 0 A A A A 
0 ss66369329 0 0 A A A A 
0 ss66368644 0 0 A A A A 
0 ss66368284 0 0 A A G A 
0 ss66126380 0 0 A G A G 
0 ss66407282 0 0 A A A A 
0 ss66405035 0 0 A A A A 
0 ss66405148 0 0 G G A G 
0 ss66405271 0 0 G G G G" 

dat <- read.table(textConnection(txt), header = TRUE) 

#Create a new object so as to not interfere with the original 
newdat <- dat[, 1:4] 

for (colInd in seq(5, (ncol(dat) - 1), by = 2)) { 
    colNames <- paste(names(dat)[colInd], names(dat)[colInd + 1], sep = "_") 
    newdat[, colNames] <- paste(dat[, colInd], dat[, colInd + 1], sep = "") 
} 

結果:

> newdat 
    V1   V2 V3 V4 V5_V6 V7_V8 
1 0 ss66369915 0 0 GA AA 
2 0 ss66112992 0 0 AA AA 
3 0 ss66369329 0 0 AA AA 
4 0 ss66368644 0 0 AA AA 
5 0 ss66368284 0 0 AA GA 
6 0 ss66126380 0 0 AG AG 
7 0 ss66407282 0 0 AA AA 
8 0 ss66405035 0 0 AA AA 
9 0 ss66405148 0 0 GG AG 
10 0 ss66405271 0 0 GG GG 
+0

這看起來太棒了!並感謝你解釋得很好!這正是我想要的。我將立即嘗試並回復你! – user796484 2011-06-14 14:36:33

+0

它工作完美!非常感謝!我正在嘗試的循環在你所做的事情的某個地方,但我絕對不會像你所說的那樣優雅。 – user796484 2011-06-14 14:57:34

0

你也可以這樣做:

library(stringr) 
newdat$V5V6 <- apply(dat[,5:6], 1, str_c, collapse="") 
newdat$V7V8 <- apply(dat[,7:8], 1, str_c, collapse="") 
+0

如果您創建了100列的列,您會如何概括這一點?這就是我認爲for循環類型結構派上用場的地方。 – Chase 2011-06-14 18:23:17