我有一个纵向数据集,每个人都有重复的观察结果:
df <- data.frame(person= c(rep(1,5), rep(2,10)),
x= c(0,rnorm(14)),
y= c(0,rnorm(14)))
我有一个自定义函数,它将两个x
和y
值作为输入并计算一个值,如下所示:
myfunc <- function(x1, y1, x2, y2)
return(x1+y1+x2+y2)
我现在想要找到一个人拥有的所有行组合的最大值(或任何其他统计数据)。
想象一下x
和y
是此人访问过的地理位置,myfunc
计算两个x / y坐标之间的距离。我想找到这些点之间的最大距离。
正如您所看到的,我的数据可能包含零,而我不知道值x
和y
,因此应跳过这些行。
这应该是一个总结,因为我的真实数据有更多的变量,我也使用汇总。
所以第一部分应该是:
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
。
但必须有一个更聪明的方法。
答案 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;对于数值计算尤其有用。