值匹配的循环不适用于多个实例的数据帧

时间:2017-06-16 21:14:57

标签: r loops

有谁能告诉我是什么阻止了这个循环的运行?

对于每一行i,在数据帧'depth.df'的第3列中,循环使用第二个数据帧'linker.df'预先形成数学函数(它将i乘以常数/来自的值通过匹配i的值找到的linker.df。

如果我为i的单个实例运行循环,(假设它= 50)它运行良好:

<f1-site>Loading</f1-site>

但如果我运行它来遍历i的每个实例,它总是返回一个错误:

cor.depth <- function(depth.df){
result  <- seq(from=1, to=(nrow(depth.df))) 
x <- 8971
for(i in 1:nrow(depth.df)){ 
       result[i] <- depth.df[i,3]*(x /( linker.df [i,2][ linker.df [i,1] == 50]))
    return(result)  
 }
}


>97,331
  

result [i]&lt; - depth.df [i,3] *(all_SC_bins /(depth.ea.bin.all [,:         替换的长度为零

修改

这是一个可重现的数据集,用于说明数据结构和问题

cor.depth <- function(depth.df){
result  <- seq(from=1, to=(nrow(depth.df))) 
x <- 8971
for(i in 1:nrow(depth.df)){ 
       result[i] <- depth.df[i,3]*(x /( linker.df [i,2][ linker.df [i,1] %in% depth.df[i,3]]))
    return(result)  
 }
}

1 个答案:

答案 0 :(得分:0)

错误出现是因为分母在大多数行上返回integer(0)numeric(0)FALSE结果。您的循环尝试查找确切的行号i,其中两个数据帧的相应X和Z匹配。可能,您打算将任何行匹配到哪里,这将需要使用第二个嵌套循环,if条件匹配。

cor.depth <- function(depth.df){
  result  <- seq(from=1, to=(nrow(depth.df))) 
  x <- 8971
  for(i in 1:nrow(depth.df)){ 
    for (j in 1:nrow(linker.df)){
      if (linker.df[j,1] == depth.df[i,3]) {
          result[i] <- depth.df[i,3]*(x /( linker.df[j,2]))
      }
    }
  }
  return(result)
}

尽管如此,请考虑merge一种更有效的矢量化方法,该方法匹配ID上两个集合之间的任何行。以下setNames重命名列以避免重复标题:

mdf <- merge(setNames(linker.df, paste0(names(linker.df), "_l")), 
             setNames(depth.df, paste0(names(depth.df), "_d")), 
                      by.x="X_l", by.y="Z_d")

mdf$result <- mdf$X_l * (8971 / mdf$Y_l)

作为比较,这两种方法是等价的:

depth.df$result <- cor.depth(depth.df)

depth.df <- with(depth.df, depth.df[order(Z),])   # ORDER BY Z    
mdf <- with(mdf, mdf[order(X_l),])                # ORDER BY X_L

all.equal(depth.df$result, mdf$result)
# [1] TRUE