R:计算每个ID区分变量的每日数

时间:2015-07-27 12:55:05

标签: r count

我之前(here is the link)问了类似的问题,这一次,我还想计算每天区分 的数量每个ID ,但现在"区分"不仅意味着一天不同的v,而且意味着今天和前进天的不同v

例如,如果第二天有v1,但前一天也有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 ,我们就不会计算第二天的v1。

ID1:

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

day2:v1 / v3 -----> 1表示第2天

day3:v3 -----> 0表示第3天

ID2

day1:v4 -----> 1表示第1天

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

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

这是我的数据:

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,我们就没有将今天的$lastSpace = strros($string, ' ')+1; // find the last space echo substr($string, $lastSpace); 与转发日期进行比较。

1 个答案:

答案 0 :(得分:1)

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

中的ave
base R

数据

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