如何在R中多次重复执行一个函数

时间:2011-06-13 19:33:45

标签: r merge iteration

我有一个看起来像这样的数据框

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.

谢谢!

2 个答案:

答案 0 :(得分:1)

也许你可以展示你试过的for循环?

这是一种使用循环的方法,如果我理解你想要的东西,它应该做你想要的。具体来说 - 这个for循环将粘贴第5列和第5列的值。 6,7&amp; 8,9和10,等等。我们使用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

答案 1 :(得分:0)

你也可以这样做:

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