对每个行组合使用自定义函数进行汇总

时间:2016-05-22 13:24:56

标签: r dplyr

我有一个纵向数据集,每个人都有重复的观察结果:

df <- data.frame(person= c(rep(1,5), rep(2,10)),
                       x= c(0,rnorm(14)),
                       y= c(0,rnorm(14)))

我有一个自定义函数,它将两个xy值作为输入并计算一个值,如下所示:

myfunc <- function(x1, y1, x2, y2)
  return(x1+y1+x2+y2)

我现在想要找到一个人拥有的所有行组合的最大值(或任何其他统计数据)。

想象一下xy是此人访问过的地理位置,myfunc计算两个x / y坐标之间的距离。我想找到这些点之间的最大距离。

正如您所看到的,我的数据可能包含零,而我不知道值xy,因此应跳过这些行。

这应该是一个总结,因为我的真实数据有更多的变量,我也使用汇总。

所以第一部分应该是:

result <- df %>% group_by(person) %>%
                     summarise(maxd = #maximum distance,
                               mind = #minimum distance,
                                ......)

我的第一个想法是以expand.grid以某种方式执行此操作以获取所有可能的行组合:

row.combis <- expand.grid(i=1:6, j=1:6) # all row combinations
row.combis <- row.combis[row.combis$j < row.combis$i, ] # skip duplicates

然后以某种方式在myfunc上循环row.combis

但必须有一个更聪明的方法。

2 个答案:

答案 0 :(得分:2)

假设您想计算正常的笛卡尔距离,可以使用dist()函数。以下是data.table获取摘要的方法:

library(data.table)
setDT(df)[, .(maxd = max(dist(data.table(x, y))), 
              mind = min(dist(data.table(x, y)))), .(person)]

   person     maxd      mind
1:      1 3.264005 0.4734630
2:      2 2.514413 0.4359193

相应的dplyr方法将如下:

df %>% group_by(person) %>% summarise(maxd = max(dist(data.frame(x, y))), 
                                      mind = min(dist(data.frame(x, y))))
Source: local data table [2 x 3]

  person     maxd      mind
   (dbl)    (dbl)     (dbl)
1      1 3.264005 0.4734630
2      2 2.514413 0.4359193

答案 1 :(得分:0)

如何将缺失的值分配给&#39; NA&#39;而不是&#39; 0&#39;。这将为您提供执行简单测试的选项,如:

is.na(test_row[i])

或其赞美

is.finite(test_row[i])

此外,您还可以在summarize()调用中动态处理这些内容。大多数函数如mean(),max()等采用可选参数&quot; na.rm = logical&#39;。 defualts几乎总是FALSE,但将其切换为&#34; TRUE&#34;对于数值计算尤其有用。