【问题标题】:R:Count daily number of a variable distinguish per IDR:计算每个ID的变量区分的每日数量
【发布时间】:2015-07-27 12:55:04
【问题描述】:

我之前也问过类似的问题(here is the link),这次也想计算一下v区分每天的次数每个ID,但现在的“区分”不仅意味着一天的v不同,还意味着这一天和前一天的不同v

例如,如果第二天有v1,而且在前一天,我们不计算第二天的v1。

ID1:

第 1 天:v1/v2 ----->第 1 天为 2

第 2 天:v1/v3 ----->第 2 天为 1

day3: v3 ----->第 3 天为 0

ID2

第 1 天:v4 -----> 第 1 天为 1

第 2 天:v5/v4/v1 ----->第 2 天为 2

第 3 天:v3/v4 ----->第 3 天为 1

这是我的数据:

ID         Day             v
ID1         1              v1
ID1         1              v1
ID1         1              v2
ID1         2              v1
ID1         2              v3
ID1         3              v3
ID1         3              v3
ID1         3              v3
ID2         1              v4
ID2         2              v5
ID2         2              v5
ID2         2              v4
ID2         2              v1
ID2         3              v3
ID2         3              v4

根据我上面的数据,我想得到如下结果:

ID         Day             v         daily_v_distinguish_ID
ID1         1              v1            2
ID1         1              v1            NA
ID1         1              v2            NA
ID1         2              v1            1
ID1         2              v3            NA
ID1         3              v3            0
ID1         3              v3            NA
ID1         3              v3            NA
ID2         1              v4            1
ID2         2              v5            2
ID2         2              v5            NA
ID2         2              v4            NA
ID2         2              v1            NA
ID2         3              v3            1
ID2         3              v4            NA

如果我们使用setDT(df1)[, daily_v_ID := c(uniqueN(v), rep(NA, .N-1)), by = .(ID, Day)],我们还没有将这一天的v与转发天进行比较。

【问题讨论】:

  • @akrun 我们不对不同的 ID 进行比较。对于 ID2,我们将 v1 计算为第 2 天,甚至 v1 在 ID1 的第 1 天发生。

标签: r count


【解决方案1】:

我们可以使用data.table 来创建“daily_v_distinguish_ID”。将“data.frame”转换为“data.table”(setDT(df1)),按“ID”分组,我们根据“v”中不是duplicated的元素创建逻辑索引。在下一步中,我们按 'ID' 和 'Day' 列分组,获取 'indx' 的 sum 并与 'NA' 连接以填充每个组中的其余元素并分配 (:= 为'daily_v_distinguish_ID'。

 library(data.table)
 setDT(df1)[, indx:=!duplicated(v) ,.(ID)
    ][, daily_v_distinguish_ID:= c(sum(indx),rep(NA, .N-1)) , .(ID, Day)
    ][,indx:=NULL]
df1
#     ID Day  v daily_v_distinguish_ID
# 1: ID1   1 v1                      2
# 2: ID1   1 v1                     NA
# 3: ID1   1 v2                     NA
# 4: ID1   2 v1                      1
# 5: ID1   2 v3                     NA
# 6: ID1   3 v3                      0
# 7: ID1   3 v3                     NA
# 8: ID1   3 v3                     NA
# 9: ID2   1 v4                      1
#10: ID2   2 v5                      2
#11: ID2   2 v5                     NA
#12: ID2   2 v4                     NA
#13: ID2   2 v1                     NA
#14: ID2   3 v3                      1
#15: ID2   3 v4                     NA

使用dplyr 的类似选项是

library(dplyr)
df1 %>% 
   group_by(ID) %>%
   mutate(ind=!duplicated(v)) %>%
   group_by(Day, add=TRUE)%>% 
   mutate(daily_v_distinguish_ID=c(sum(ind), rep(NA, n()-1))) %>% 
   select(-ind)

或者使用来自base Rave

with(df1, ave(!duplicated(df1[-2]), ID, Day, FUN=function(x) 
                  c(sum(x), rep(NA, length(x)-1))))
#[1]  2 NA NA  1 NA  0 NA NA  1  2 NA NA NA  1 NA

数据

df1 <- structure(list(ID = c("ID1", "ID1", "ID1", "ID1", "ID1", "ID1", 
"ID1", "ID1", "ID2", "ID2", "ID2", "ID2", "ID2", "ID2", "ID2"
), Day = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 2L, 2L, 2L, 2L, 
3L, 3L), v = c("v1", "v1", "v2", "v1", "v3", "v3", "v3", "v3", 
"v4", "v5", "v5", "v4", "v1", "v3", "v4")), .Names = c("ID", 
"Day", "v"), class = "data.frame", row.names = c(NA, -15L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多