Как повторить выполнение функции в R несколько раз - PullRequest
1 голос
/ 13 июня 2011

У меня есть кадр данных, который выглядит следующим образом

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.

Мне было интересно, как я могу добиться этого, не делая это вручную.Я попытался использовать для цикла безуспешно.Я очень новичок в использовании R.

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Может быть, вы можете показать цикл for, который вы пробовали?

Вот один из подходов, использующий цикл, который должен делать то, что вы хотите, если я понимаю, что вы хотите. В частности - этот цикл for вставит значения столбцов 5 и 6, 7 и 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
0 голосов
/ 14 июня 2011

Вы также можете сделать:

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