查看每个用户的计数变化百分比
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
选项用于查找 last
与 first
'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))
我有一些问题一直在努力解决。我有一个凌乱的数据框,我已经设法重新排列成这种格式。
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
选项用于查找 last
与 first
'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))