这是我的数据:
ID Date v
ID1 1 v1
ID1 1 v1
ID1 1 v8
ID1 2 v5
ID1 2 v3
ID1 3 v3
ID2 1 v7
ID2 2 v15
ID2 2 v15
ID2 3 v3
我要计算v的数量区分每天和每个 ID。正如我上面的数据,我想得到这样的结果:
ID Date v daily_v_distinguish_ID
ID1 1 v1 2
ID1 1 v1 NA
ID1 1 v8 NA
ID1 2 v5 2
ID1 2 v3 NA
ID1 3 v3 1
ID2 1 v7 1
ID2 2 v15 1
ID2 2 v15 NA
ID2 3 v3 1
如何解决?提前谢谢你!
然后,如果我只想计算每个ID每天的v(不区分)的数量,如何更改代码?
预期结果:
ID Date v daily_v_distinguish_ID daily_v_ID
ID1 1 v1 2 3
ID1 1 v1 NA 3
ID1 1 v8 NA 3
ID1 2 v5 2 2
ID1 2 v3 NA 2
ID1 3 v3 1 1
ID2 1 v7 1 1
ID2 2 v15 1 2
ID2 2 v15 NA 2
ID2 3 v3 1 1
最佳答案
您可以尝试使用 devel
data.table
的版本IE。 v1.9.5
.安装devel版本的说明是 here
library(data.table)#v1.9.5+
setDT(df1)[, daily_v_ID:= ifelse((1:.N)==1L, uniqueN(v), NA) , by = .(ID, Date)]
或者
setDT(df1)[, daily_v_ID := c(uniqueN(v), rep(NA, .N-1)), by = .(ID, Date)]
或者按照@David Arenburg 的建议
indx <- setDT(df1)[, .(.I[1L], uniqueN(v)), by = .(ID, Date)]
df1[indx$V1, daily_v_ID := indx$V2]
或使用
dplyr
library(dplyr)
df1 %>%
group_by(ID,Date) %>%
mutate(daily_v_ID= ifelse(row_number()==1, n_distinct(v), NA))
或与
base R
df1$daily_v_ID <- with(df1, ave(as.numeric(factor(v)), Date,ID,
FUN= function(x) NA^(seq_along(x)!=1)*length(unique(x))))
更新
对于编辑过的帖子,我们通过获取
length(v)
创建一个变量('daily_v_ID')。或在 data.table
,我们可以使用 .N
setDT(df1)[, c('daily_v_distinguish_ID', 'daily_v_ID'):= list( c(uniqueN(v),
rep(NA, .N-1)), .N), by = .(ID, Date)]
df1
# ID Date v daily_v_distinguish_ID daily_v_ID
# 1: ID1 1 v1 2 3
# 2: ID1 1 v1 NA 3
# 3: ID1 1 v8 NA 3
# 4: ID1 2 v5 2 2
# 5: ID1 2 v3 NA 2
# 6: ID1 3 v3 1 1
# 7: ID2 1 v7 1 1
# 8: ID2 2 v15 1 2
# 9: ID2 2 v15 NA 2
# 10: ID2 3 v3 1 1
注意:
uniqueN
在 v1.9.5
中介绍.对于早期版本,我们可以使用 unique(length(v))
或使用
dplyr
df1 %>%
group_by(ID, Date) %>%
mutate(daily_v_distinguish_ID = ifelse(row_number()==1,
n_distinct(v), NA),
daily_v_ID =n())
关于R:计算每个ID的变量区分的每日数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31313275/