在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软件包。
答案 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中。
希望这会有所帮助!!