【问题标题】:Iterating two big data frames in R. Comparing 2 different positions at the same time using conditions在 R 中迭代两个大数据帧。使用条件同时比较 2 个不同的位置
【发布时间】:2012-01-25 21:44:20
【问题描述】:

我试图在 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 中,当我只有两个样本时,我没有任何问题,我将文件加载到两个 estructures 中,数组的散列,然后我使用嵌套的 foreach 循环比较它们,但它只需要 2 个样本的时间,想象一下100!我在 R 中尝试过,将数据加载到 2 个数据帧中,并将其用作

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

问题是我需要类似循环或应用函数的东西来使用第一个 cpg 值然后第二个迭代表达式数据,如果它们在表达式中成对出现,则输入表达式值和距离。

欢迎任何想法

提前致谢

`

【问题讨论】:

  • 第一个文件中的第一列实际上是否有所不同?如果是这样,它是否会通过第二列的所有排列?我可以看到第 1 列和第 2 列出现“cg00000029 cg01016459”,但是否出现相反的情况?
  • 不,其实2个点只有一个距离,不重复
  • 第一列不同,但实际上2个点只有一个距离,它不重复,所以一旦计算出这个特定cpg的距离,它们就不会重复

标签: r loops dataframe apply


【解决方案1】:

如果您的第一个数据在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
> 

【讨论】:

  • 谢谢贾斯汀!它是如何工作的?这是我第一次看到这两个
  • 答案很长!在这种情况下,melt 用于获取您的第二个数据集并将其放入“长”格式,这对于 plyr 来说更容易使用。 plyr 函数都以 ply 结尾,前导的两个字母告诉您输入和输出的内容(在本例中是数据框输入和列表输出)。第二个参数是一个分裂变量。在这种情况下,根据 teh calue 列中的唯一值将 target.melt 拆分为单独的数据帧...我敢肯定!
【解决方案2】:

您可以使用merge 连接两个data.frame,使用melt 将结果转换为高格式,然后使用@ 对每个结果应用一个函数(例如,保存到文件) 987654323@.

# 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" ) 
} )

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2017-04-26
    相关资源
    最近更新 更多