2011-06-13 116 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