我有一些问题,我一直在和他摔跤。我有一个凌乱的数据框架,我已设法重新安排这种格式。
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%
... ...
任何帮助都会很棒。
答案 0 :(得分:1)
正如评论中所讨论的,dplyr
选项可以找到last
与first
' 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))