R: 运行 数据帧之间的逐行操作

R: Running row-wise operations between data frames

我想 运行 在两个数据帧 gexmxy 之间逐行匹配进行统计测试。问题是我需要 运行 多次,每次使用 gex 中的不同列,为每个 运行.

产生不同的测试结果向量

在@kristang 的大力帮助下,这是我目前所拥有的(使用示例值)。

gex <- data.frame("sample" =  c(987,7829,15056,15058,15072), 
                  "TCGA-F4-6703-01" = runif(5, -1, 1),
                  "TCGA-DM-A28E-01" = runif(5, -1, 1),
                  "TCGA-AY-6197-01" = runif(5, -1, 1),
                  "TCGA-A6-5657-01" = runif(5, -1, 1))
colnames(gex) <- gsub("[.]", "_",colnames(gex))

listx <- c("TCGA_DM_A28E_01","TCGA_A6_5657_01")

mxy <- data.frame("TCGA-AD-6963-01" = runif(5, -1, 1),
                  "TCGA-AA-3663-11" = runif(5, -1, 1),
                  "TCGA-AD-6901-01" = runif(5, -1, 1),
                  "TCGA-AZ-2511-01" = runif(5, -1, 1),
                  "TCGA-A6-A567-01" = runif(5, -1, 1)) 

colnames(mxy) <- gsub("[.]", "_",colnames(mxy))

zScore <- function(x,y)((as.numeric(x) - as.numeric(rowMeans(y,na.rm=T)))/as.numeric(sd(y,na.rm=T)))

## BELOW IS FOR DIAGNOSTICS

write.table(mxy, file = "mxy.csv", 
            row.names=FALSE, col.names=TRUE, sep=",", quote=F)

write.table(gex, file = "gex.csv", 
            row.names=FALSE, col.names=TRUE, sep=",", quote=F)

## ABOVE IS FOR DIAGNOSTICS

for(i in seq(nrow(mxy)))
  for(colName in listx){

    zvalues <- zScore(gex[,colName[colName %in% names(gex)]],
                      mxy[i,])

    ## BELOW IS FOR DIAGNOSTICS

    write.table(gex[,colName[colName %in% names(gex)]], file=paste0(colName, "column", ".csv"),
                row.names=FALSE,col.names=FALSE,sep=",",quote=F)

    write.table(mxy[i,], file=paste0(colName, "mxyinput", ".csv"),
                row.names=FALSE,col.names=FALSE,sep=",",quote=F)

    ## ABOVE IS FOR DIAGNOSTICS

    geneexptest <- data.frame(gex$sample, zvalues, row.names = NULL, 
                              stringsAsFactors = FALSE)
    write.csv(geneexptest, file = paste0(colName, ".csv"), 
              row.names=FALSE, col.names=FALSE, sep=",", quote=F)
  }

问题是,虽然它似乎通过正确的行数创建了正确数量的输出文件,等等...但它没有产生正确的 z 分数。我想让它计算:

((来自第 z 行和给定 gex 列的值) - (mxy 中 z 行中值的平均值)) / (mxy 中 z 行中值的标准差)

然后移动到下一行,以此类推,填充第一个向量。然后,我希望它使用 gex 的下一列计算相同的东西,填充一个单独的向量。我希望这是有道理的。

我有一个单独的脚本,它 运行 使用预先确定的列与其他数据框进行相同的测试。该脚本中的相关 for 循环如下所示:

for(i in seq_along(mxy)){
  zvalues[i] <- (gex_column_W[i] - mean(mxy[i,])) / sd(mxy[i,])
}

我认为您的代码中可能有错字,具体来说,您说您想要 "Mean of values in row z across mxy" 但使用的 mean(mxy[,i])) 选择第 i 列,而不是第 i 行。为了清楚起见,我用 for 循环重写了这一部分。 (不确定您为什么使用 lapply?)

# a function fo calculationg the z score
zScore <- function(x,y)(x - mean(y,na.rm=T))/sd(y,na.rm=T)

for(i in seq(nrow(mxy))) # note that length(mxy) is actually the number of columns in mxy
for(colName in listx){
    zvalues <- zScore(gex[,colName],# column == colName
                      mxy[i,])# row == i
    geneexptest <- data.frame(gex$sample, zvalues, row.names = NULL, 
                          stringsAsFactors = FALSE)
    write.table(geneexptest, file = paste0(colName, "mxyinput", ".csv"),
                row.names=FALSE, col.names=FALSE,  quote=F,
                sep = ",", dec = ".", append=(i > 1))

}

和不依赖于append的替代方案:

for(colName in listx){
    geneexptest <- NULL
    for(i in seq(nrow(mxy))) {
        zvalues <- zScore(gex[,colName],# column == colName
                          mxy[i,])# row == i
        geneexptest <- rbind(geneexptest,
                            data.frame(gex$sample, zvalues, row.names = NULL, 
                              stringsAsFactors = FALSE))
    }
    write.table(geneexptest, file = paste0(colName, "mxyinput", ".csv"),
                row.names=FALSE, col.names=FALSE,  quote=F,
                sep = ",", dec = ".", append=(i > 1))
}