有谁能告诉我是什么阻止了这个循环的运行?
对于每一行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)
}
}
答案 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