这是一个示例数据集:
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
答案 0 :(得分:2)
这应该按照你的要求进行
df %>%
group_by(ID) %>%
summarize((max(V1) - min(V1)) / (first(V2[V1 == max(V1)]) - last(V2[V1 == min(V1)])) )
答案 1 :(得分:1)
我们可以创建{V1}的max
和min
值索引,然后使用它来计算'斜率。 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