查看每个用户的计数变化百分比

Looking at Percent Change of Count per user

我有一些问题一直在努力解决。我有一个凌乱的数据框,我已经设法重新排列成这种格式。

user_id  date     n
user1    1-1-15   60
user1    1-2-15   25
user1    1-5-15   20
user2    1-2-15   23
user2    1-4-15   15
user3    2-12-15  9
...      ...      ...

用户开始日期和结束日期并不全部同步,有些不连续。理想情况下,我想找到每个用户一生中的百分比变化。类似于:

user_id delta
user1   -%15
user2   -%27
user3    0%
...      ...

任何帮助都会很棒。

正如评论中所讨论的,dplyr 选项用于查找 lastfirst 'n' 的变化,按 'user_id' 分组

library(dplyr)
df1 %>%
  group_by(user_id) %>%
  summarise(delta= 10*first(n)/(last(n)-first(n))) 

使用 data.table 的类似选项是将 'data.frame' 转换为 'data.table' (setDT(df1)),按 'user_id' 分组,我们创建 'delta' 列通过计算最后一个 'n' (n[.N]) 相对于第一个 (n[1L]) 的变化。如果组内元素的数量大于 1 (.N >1) 或 else 到 return 0.

library(data.table)
setDT(df1)[, list(delta=if(.N>1) 10*n[1L]/(n[.N]-n[1L]) else 0), by = user_id]

假设我们需要为每个'user_id'做lm,我们可以在do环境中得到slope。就像前面的例子一样,如果元素的数量大于 1,我们可以创建一个 if/else 条件到 return 斜率值,否则到 return 0.

df1 %>%
   group_by(user_id) %>%
   mutate(N= n()) %>%
   do(data.frame(slope= if(.$N[1L] >1) coef(lm(.$n~.$date))[2] else 0))

或者使用data.table,按'user_id'

分组后得到coef
setDT(df1)[, if(.N>1) coef(lm(n~date))[2] else 0 , user_id]

数据

df1 <- structure(list(user_id = c("user1", "user1", "user1", "user2", 
"user2", "user3"), date = c("1-1-15", "1-2-15", "1-5-15", "1-2-15", 
"1-4-15", "2-12-15"), n = c(60L, 25L, 20L, 23L, 15L, 9L)),
.Names = c("user_id", 
"date", "n"), class = "data.frame", row.names = c(NA, -6L))