请考虑以下(简化矩阵)。
x1 <- c(2,2,2,3,1,2,4,6,1,2,4)
y1 <- c(5,4,3,3,4,2,1,6,4,2,3)
x2 <- c(8,2,7,3,1,2,2,2,1,2,6)
y2 <- c(1,3,3,3,1,2,4,3,1,2,8)
x3 <- c(4,4,1,2,4,6,3,2,4,6,9)
y3 <- c(1,2,3,3,1,2,4,6,1,2,1)
x4 <- c(4,4,1,2,4,6,3,2,4,6,9)
y4 <- c(1,2,3,3,1,2,4,6,1,2,1)
x5 <- c(4,1,2,4,6,2,3,3,6,2,9)
y5 <- c(1,3,3,3,1,2,4,6,1,2,1)
ID <- c(1,2,3,4,5,6,7,8,9,10,11)
id1 <- c("a","a","a","a","b","b","b","b","b","b","b")
id2 <- c("f","f","g","h","h","i","j","k","k","k","l")
dat <- data.frame(x1,y1,x2,y2,x3,y3,id1, id2)
我想要实现的是获得每组id1的每个id2与所有其他id(不是id2)之间的平均距离。
我从
开始matrix_split <- split(dat, dat$id1)
这使我得到了分裂矩阵,在这个简化的例子中2.我可以轻松创建距离矩阵,然后显示每个群组成员的平均距离:
dist <- lapply(matrix_split, function(x) dist(x, diag=TRUE, upper=TRUE))
dist2 <- lapply(dist, as.matrix)
mean <- lapply(dist2, rowMeans)
现在,我的问题是如何找到每行的ONLY平均距离。也就是说,在这个距离矩阵中,我只计算那些不是同一个id2元素的rowMeans函数。
例如,对于ID = 1,它位于“f”组中,不应该为rowMeans计算ID2。有没有办法这样做?这个例子是简化的,并且有大约400个矩阵,因此不包含每个单个矩阵的代码的操作将是好的。
所以而不是 DIST2 $一个
ID 1 2 3 4
1 0.000000 7.483315 5.416026 7.483315
2 7.483315 0.000000 6.928203 3.265986
3 5.416026 6.928203 0.000000 4.898979
4 7.483315 3.265986 4.898979 0.000000
这太好了!
ID 1 2 3 4
1 0.000000 NA 5.416026 7.483315
2 NA 0.000000 6.928203 3.265986
3 5.416026 6.928203 0.000000 4.898979
4 7.483315 3.265986 4.898979 0.000000
从那里我将继续使用rowMeans:
1 4.29978
2 3.398063
3 ....
4 ....
也许可以解决问题。有什么建议?现在谢谢!!托比