R中等效的javascript减少

时间:2016-05-27 21:11:59

标签: javascript r

在javascript中,我可以将数据数组减少为单个值。例如,如果我想找到一个数组中有多少点在距离(4,3)的欧几里德距离内,我可以这样做:

var x = 4;
var y = 3;

var howManyPointsAreWithinRange = a.reduce( (pd, d) => {
    var xp = d.weight;
    var yp = d.total;
    var distance = Math.sqrt(Math.pow(x - xp) + Math.pow(y - yp));
    if (distance < 10) {
        return pd + 1;
    }

    return pd;
}, 0);

在R中,我尝试了聚合函数,apply family和dplyr,但是所有人都认为你想用一些变量对结果进行分组。如何在R中实现reduce()的相同功能?

我的R版本不支持funprog软件包。

2 个答案:

答案 0 :(得分:2)

大多数R运算符和函数都使用向量,因此您可以执行以下操作:

d <- data.frame(weight=c(1:10), total=c(11:20))
   weight total
1       1    11
2       2    12
3       3    13
4       4    14
5       5    15
6       6    16
7       7    17
8       8    18
9       9    19
10     10    20

x<-4
y <- 3

x-d$weight
 [1]  3  2  1  0 -1 -2 -3 -4 -5 -6

(x-d$weight)^2
 [1]  9  4  1  0  1  4  9 16 25 36

sqrt((x-d$weight)^2+(y-d$total)^2)
 [1]  8.544004  9.219544 10.049876 11.000000 12.041595 13.152946 14.317821 15.524175 16.763055 18.027756

然后,要计算符合条件的项目数,您可以通过求和来计算条件数TRUE(= 1):

sum(sqrt((x-d$weight)^2+(y-d$total)^2)<10)
[1] 2

答案 1 :(得分:2)

reduce()是JavaScript中的基本函数,它只是将函数连续应用于数组的所有元素。如果您想在R中复制该功能,可以使用:

reduce <- function(arr,fun,start) {
    current <- start
    for (i in 1:length(arr)) {
        current <- fun(current,arr[i])
    }
    current
}

这复制了JS&#39;的功能。 reduce,如果您需要使用不同的复杂函数的通用,灵活的缩减方法,这可能很有用。然而,R很酷,因为它以这种方式处理许多功能无论如何;例如,sum(arr)与上面的reduce(arr,sum,0)的工作方式相同。因此,可能值得检查您所需的功能是否已存在于基础R中。

希望这会有所帮助!!