我之前(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);
与转发日期进行比较。
答案 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