我在r
中有以下数据框 count1 count2 count3 Count4
0 12 11 0
12 0 44 23
22 32 0 12
我想在行上应用的公式就像这样
1st row sqrt((count2-count3)^2)
2nd row sqrt((count1-count3)^2 + (count1-count4)^2 + (count3-count4)^2)
3rd row sqrt((count1-count2)^2 + (count1-count4)^2 + (count2-count4)^2)
我不想考虑零值的列。我上面有6列。我怎么能在r?
中做到这一点申请循环并检查非零元素的每一行是一项繁琐的工作。
答案 0 :(得分:2)
使用:
apply(df, 1, function(x) {
y <- x[x!=0]
yc <- combn(y,2)
sqrt(sum(apply(yc, 2, function(x) (x[1] - x[2])^2)))
})
给出:
[1] 1.00000 39.82462 24.49490 776.72389
您可以将其缩短为:
apply(df, 1, function(x) {
sqrt(sum(apply(combn(x[x!=0],2), 2, function(x) (x[1] - x[2])^2)))
})
回应your comment:
out <- apply(df, 1, function(x) {
y <- x[x!=0]
yc <- combn(y,2)
sqrt(sum(apply(yc, 2, function(x) (x[1] - x[2])^2)))
})
100*out/max(out)
给出:
[1] 0.1287459 5.1272551 3.1536171 100.0000000
使用过的数据:
df <- structure(list(count1 = c(0L, 12L, 22L, 160L), count2 = c(12L, 0L, 32L, 621L),
count3 = c(11L, 44L, 0L, 573L), count4 = c(0L, 23L, 12L, 624L)),
.Names = c("count1", "count2", "count3", "count4"), class = "data.frame", row.names = c(NA, -4L))
看起来像:
> df count1 count2 count3 count4 1 0 12 11 0 2 12 0 44 23 3 22 32 0 12 4 160 621 573 624