这里是我的数组
my.array=structure(list(var1 = 1L, var2 = 8L, var3 = 6L, var4 = 2L, var5 = 5L,
var6 = 4L, var7 = 8L, var8 = 3L, var9 = 7L), .Names = c("var1",
"var2", "var3", "var4", "var5", "var6", "var7", "var8", "var9"
), class = "data.frame", row.names = c(NA, -1L))
在直方图中,此数组具有线的形式(对不起,我是在绘画中画的)
如何找到两条线,在这两条线之间可以放入最大量的东西(例如水)
我用蓝色涂上了水箱中的水。
从视觉上看,我看到7 point
在第y axis
行之间沿2 and 9 of x asis
的最大音量。 (7 * 7 = 49)。由于9 line
具有y轴的最后一个point on 7
,而line two
具有y轴的最后一个point 8 on y asis
,因此形成了尽可能多的填充体积,并形成了具有最大体积的长直线。
我如何通过R中的数组而不是手动方式来计算此类结果?
答案 0 :(得分:2)
您可以先将变量名称定义为数字x位置,然后将其与y位置耦合。
df <- data.frame(x = seq_along(my.array),
y = t(my.array))
然后,我们想将data.frame中的每一行与data.frame中的每一行进行比较,因此我们将为要比较的行建立索引。我之所以使用my.array
是因为它们已经成为df
的行名,因此可以用作索引。
idx <- t(combn(names(my.array), 2))
接下来,我将遍历索引的行,查找关联的变量并进行计算。您用蓝色表示的区域的宽度是x位置的绝对差,而区域的高度是两个y位置的最小值。
area <- apply(idx, 1, function(i){
# i will be a row of idx, so i[[1]] has the first column and i[[2]] the second
dx <- abs(df[i[[1]], "x"] - df[i[[2]], "x"])
ymin <- min(df[i[[1]], "y"], df[i[[2]], "y"])
dx * ymin
})
然后您可以将所有内容放在一起进行后续分析
output <- cbind.data.frame(idx, area = area)
head(output)
1 2 area
1 var1 var2 1
2 var1 var3 2
3 var1 var4 3
4 var1 var5 4
5 var1 var6 5
6 var1 var7 6