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

时间:2015-08-29 12:49:01

标签: r data-analysis

我有一些问题,我一直在和他摔跤。我有一个凌乱的数据框架,我已设法重新安排这种格式。

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%
...      ...

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

正如评论中所讨论的,dplyr选项可以找到lastfirst' n'的变化,按' user_id&#分组39;会是

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(if/else)或.N >1以返回0,我们还可以else条件返回计算值。

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,我们可以在slope环境中获得do。就像前面的情况一样,如果元素的数量大于1,我们可以创建一个if/else条件来返回斜率值,否则返回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))