Итерация двух больших фреймов данных в R. Сравнение двух разных позиций одновременно с использованием условий - PullRequest
0 голосов
/ 26 января 2012

Я пытался решить эту проблему в PERL, но она работает только с меньшими данными, поэтому мне нужно решение в R, которое, я думаю, быстрее и проще, чем PERL, в любом случае. Я получил один файл, как этот, с двумя позициями в геноме (первый и второй столбец) и расстоянием между ними (третий столбец)

cg00000029  cg01016459  848
cg00000029  cg02021817  38
cg00000029  cg02851944  13
cg00000029  cg02976952  238
cg00000029  cg03943270  93
cg00000029  cg07396495  604
cg00000029  cg12190057  929

И мой второй файл - это этот файл с положением в геноме и одним значением выражения в каждом столбце для каждого образца (от 1 до 6)

TargetID    sample1 sample2 sample3 sample4 sample5 sample6
cg00000029  0.157   0.444   0.466   0.805   0.5489  0.448
cg01016459  0.873   0.930   0.926   0.942   0.932   0.9128  
cg03943270  0.871   0.920   0.926   0.942   0.942   0.942

На самом деле у меня есть 100 образцов. Моя идея состоит в том, чтобы получить окончательный файл для каждого образца со значениями выражения вместо CG и расстояние. Например, для образца 1

0.157  0.873 848
0.157  0.871  93

для образца 2

0.444   0.930 848
0.444   0.920   93

В PERL у меня нет проблем, когда я получил только два семпла, я загружаю файлы в две структуры, хэши массивов, а затем сравниваю их, используя вложенные циклы foreach, но это занимает столько времени только для двух семплов 100! Я пытался в R, загружая данные в 2 кадра данных и использовать что-то как

expression[rownames(expression) %in% rownames(distances),]

проблема в том, что мне нужно что-то вроде цикла или функции применения для итерации по данным выражения, используя первое значение cpg, а затем второе, если они выражены парами в выражениях, поместите значения выражения и расстояния.

Любые идеи приветствуются

Заранее спасибо

`

Ответы [ 2 ]

2 голосов
/ 26 января 2012

, если ваши первые данные в dat

structure(list(V1 = c("cg00000029", "cg00000029", "cg00000029", 
"cg00000029", "cg00000029", "cg00000029", "cg00000029"), V2 = c("cg01016459", 
"cg02021817", "cg02851944", "cg02976952", "cg03943270", "cg07396495", 
"cg12190057"), V3 = c(848L, 38L, 13L, 238L, 93L, 604L, 929L)), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -7L))

, а второй набор в target

structure(list(TargetID = c("cg00000029", "cg01016459", "cg03943270"
), sample1 = c(0.157, 0.873, 0.871), sample2 = c(0.444, 0.93, 
0.92), sample3 = c(0.466, 0.926, 0.926), sample4 = c(0.805, 0.942, 
0.942), sample5 = c(0.5489, 0.932, 0.942), sample6 = c(0.448, 
0.9128, 0.942)), .Names = c("TargetID", "sample1", "sample2", 
"sample3", "sample4", "sample5", "sample6"), class = "data.frame", row.names = c(NA, 
-3L))

match() даст вам то, что вы ищете,Я бы использовал пакеты reshape и plyr.В частности, melt и ddply, но я уверен, что есть версия для применения.

target.melt <- melt(target,id.var='TargetID')

my.func <- function(lookup,df) {
  cg.one <- lookup$value[match(df$V1,lookup$TargetID)]
  cg.two <- lookup$value[match(df$V2,lookup$TargetID)]

  return(list(cgone=cg.one,cgtwo=cg.two,distance=df$V3))
}

out <- dlply(target.melt,.(variable),my.func,df=dat)

есть куча NA с вашими данными, так как второй набор данных неполный, но то, что вы просилиесть:

> na.omit(as.data.frame(out[[1]]))
  cgone cgtwo distance
1 0.157 0.873      848
5 0.157 0.871       93
> 
0 голосов
/ 26 января 2012

Вы можете объединить два data.frames с помощью merge, преобразовать результат в высокий формат с помощью melt, а затем применить функцию (например, для сохранения в файл) к каждому фрагменту результата с помощью d_pply.

# Sample data
n <- length(LETTERS)
d1 <- cbind( expand.grid( LETTERS, LETTERS ), rnorm( n*n ) )
names(d1) <- c("id1", "id2", "distance")
d1 <- d1[ as.character(d1$id1) < as.character(d1$id2), ]
d2 <- as.data.frame( matrix( rnorm(n*6), nr=n ) )
d2 <- data.frame( id=LETTERS, d2 )
names( d2 )[-1] <- paste( "sample", 1:6, sep="")

# If the distance data.frame only contains half the pairs,
# i.e., if it only contains one of (a,b) and (b,a), 
# add the missing ones.    
d1a <- d1
d1b <- d1[,c(2,1,3)]
names(d1b) <- names(d1a)
d1 <- rbind( d1a, d1b )
d1 <- d1[ ! duplicated( d1[,1:2]), ]

# Merge the two data.frames    
d <- merge( d1, d2, by.x="id1", by.y="id" )

# Convert to tall format
library(reshape2)
d <- melt(d, id.vars=c("id1", "id2", "distance"))

# Apply a function to each chunk
d_ply( d, "variable", function (u) { 
  cat( "Would save ", nrow(u), " rows to ", as.character(u$variable[1]), "\n" ) 
} )
...