我有一个看起来像这样的数据框
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.
谢谢!
答案 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="")