计算R中数组中线之间的最大体积

时间:2019-07-14 12:25:28

标签: r ggplot2

这里是我的数组

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))

在直方图中,此数组具有线的形式(对不起,我是在绘画中画的)

enter image description here

如何找到两条线,在这两条线之间可以放入最大量的东西(例如水)

我用蓝色涂上了水箱中的水。 从视觉上看,我看到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中的数组而不是手动方式来计算此类结果?

1 个答案:

答案 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