已解决感谢大家的帮助!
我认为我犯了一个简单的错误,我一直盯着看太长时间。我有一个包含4个类的数据帧(存储为数字)。列表示站点,行表示日期。但是,这些站点的分布并不均匀,因此我将最终行中每个站点与其相邻站点之间的距离合并。我遇到的问题来自于尝试迭代数据帧,并总结每个类的总距离:
dist_prop = data.frame(cbind(1:4, 0))
for (i in 1:(nrow(df)-1)){
for (j in 1:(ncol(df))){
dist_prop[(df[j,i]),2] = dist_prop[(df[j,i]),2]+df[nrow(df),j]
}
}
我已经查看了代码的不同部分,并且无法找到错误的位置。它返回值,但它们太低了。
感谢您提供任何帮助。
修改
不幸的是,我无法共享数据。但它采用以下格式:
df = cbind(c(1,1,1,1,2,2,3),
c(1,1,2,2,3,3,4),
c(1,2,3,3,3,3,4),
c(1,1,1,1,1,2,3)) # classes
df = data.frame(rbind(df, c(0.2, 0.8, 1.2, 0.4))) # distances
我的目的是通过将每个类的相应距离值相加来获得每个类占用的总距离。相反,它返回较低的值:1:6.4,2:2.4,3:1.6,4:0 预期结果是以下文本的计算:
column 1 column 2 column 3 column 4 TOTAL
[1,] "4*0.2" "2*0.8" "1*1.2" "5*0.4" "5.6"
[2,] "2*0.2" "2*0.8" "1*1.2" "1*0.4" "4.8"
[3,] "1*0.2" "2*0.8" "4*1.2" "1*0.4" "7"
[4,] "0*0.2" "1*0.8" "1*1.2" "0*0.4" "2"
我的目标是让代码返回 TOTAL 。
我希望这会稍微清除它并提供一个体面的例子。我相信它符合最小,完整和可验证的标准,因为它似乎在我运行示例时复制了这个问题。
抱歉,共有2个错误。现在更正了。总计是类总数(总计1 =第1列1 +第2列1 +第3列1 +第4列1)
答案 0 :(得分:2)
如果我理解你的问题,你就会在原始矩阵的每一列中列出/计算值1,2,3和4。然后你用距离进行矩阵乘法:
df0 <- cbind(c(1,1,1,1,2,2,3), c(1,1,2,2,3,3,4), c(1,2,3,3,3,3,4), c(1,1,1,1,1,2,3)) # classes
D <- c(0.2, 0.8, 1.2, 0.4) # distances
# apply(df0, 2, function(x) tabulate(x,4)) ## the counting
apply(df0, 2, function(x) tabulate(x,4)) %*% D
# > apply(df0, 2, function(x) tabulate(x,4)) %*% D
# [,1]
# [1,] 5.6
# [2,] 3.6
# [3,] 7.0
# [4,] 2.0
如果你想要一个矢量:
c(apply(df0, 2, function(x) tabulate(x,4)) %*% D)
# > c(apply(df0, 2, function(x) tabulate(x,4)) %*% D)
# [1] 5.6 3.6 7.0 2.0
或使用sweep()
代替矩阵乘法:
rowSums(sweep(apply(df0, 2, function(x) tabulate(x,4)), 2, STATS=D, FUN='*'))
# > rowSums(sweep(apply(df0, 2, function(x) tabulate(x,4)), 2, STATS=D, FUN='*'))
# [1] 5.6 3.6 7.0 2.0
或
rowSums(apply(df0, 2, function(x) tabulate(x,4)) * rep(D, each=4))
# > rowSums(apply(df0, 2, function(x) tabulate(x,4)) * rep(D, each=4))
# [1] 5.6 3.6 7.0 2.0