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

标签 r count

这是我的数据:

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

注意:uniqueNv1.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/

相关文章:

jquery - 文本区域中的字符数

java - 使用Java在DynamoDb中找不到QueryRequest的SetCount方法

r - 使用 R 绘图创建 xlsx 的最快方法

r - 将数据框转换为深度嵌套列表

Rpy2 - 数据帧列表列表

mysql 使用 count() 比较列

r - 如何在 R 中创建具有连续 x 轴的箱线图?

r - 通过一列合并两个列表之间的 data.frames

arrays - 如果仅前6个字符不同,如何计算行数?

C# 使用单个 for 循环填充二维数组矩阵