使用dplyr的最小/最大斜率

时间:2015-09-23 14:19:11

标签: r dplyr

这是一个示例数据集:

library(dplyr)
df <- data.frame(ID=c(1,1,1,1,2,2,2,2),
             V1=c(30,20,10,10,30,30,15,20),
             V2=c(1:4,1:4))

我按ID分组

df_byID <- df %>% group_by(ID)

我可以像这样计算每个人(ID)的斜率:

df_slope <- df_byID %>%
  do(fit = lm(V1 ~ V2, .)) %>%
  summarise(v_slope = coef(fit)[2])

我现在想要每个ID的最小/最大值的斜率。 如果V1有几个相同值的出现,我想使用第一个用于最大值,最后一个用于最小值。

在这个例子中我们得到:

<=>对于ID = 1:(10-30)/(4-1)= -6.66

对于ID = 2:(15-30)/(3-1)= -7.5

2 个答案:

答案 0 :(得分:2)

这应该按照你的要求进行

df %>% 
group_by(ID) %>% 
summarize((max(V1) - min(V1)) / (first(V2[V1 == max(V1)]) - last(V2[V1 == min(V1)])) )

答案 1 :(得分:1)

我们可以创建{V1}的maxmin值索引,然后使用它来计算'斜率。 which.max获取第一个max值的位置(如果存在关联),row_number()相当于rank(ties.method='first')。因此,如果我们将'V1'更改为负数,请获取row_number,然后通过max获取which.max值的位置,这相当于找到最后一个'min'值位置。使用这些索引来计算“斜率”。

df_byID  %>% 
      mutate(Max = which.max(V1), Min= which.max(row_number(-V1))) %>% 
      summarise(slope= (V1[Min[1L]]-V1[Max[1L]])/(V2[Min[1L]]-V2[Max[1L]]))
#      ID     slope
#  (dbl)     (dbl)
#1     1 -6.666667
#2     2 -7.500000