R group_by 并使用 mutate 计算具有条件的数据框列中的不同值

R group_by and count distinct values in dataframe column with condition, using mutate

R group_by 并使用 mutate

计算具有条件的数据框列中的不同值

这与问题 类似,但略有不同,因为我想与条件一起变异。计算每组中的不同值,但也存在于向量 c

id = c(  1,  1,  2,  2,  3,  4,  4,  5,  5,  5,  6,  6,  6,  6 )
val = c(100,100,200,300,400,500,500,500,600,600,200,200,300,500)
df <- data.frame(id=id, val=val)
c= c(200,500)

我知道下面的代码是错误的,但它给出了我正在尝试做的事情的想法。 因此,我想通过按 id 对 df 进行分组来创建第四列,其中不同值的计数在 c 中出现时给出

x <- df %>% group_by(id) %>% 
  mutate(distinctValues = n_distinct(val %in% c ))

如果我们考虑 id = 6,其中存在的 distict 值是 200,300 和 500。但是 c[=30= 中不存在 300 ].所以计数是= 2.

所以输出列将是 c(0,0,1,1,0,1,1,1,1,1,2,2,2,2)

由于 c 是唯一的,您可以从另一个方面来处理它 - 计算 val.

中出现的 c 个值的数量
df %>% 
  group_by(id) %>% 
  mutate(distinctValues = sum(c %in% val))
# # A tibble: 14 x 3
# # Groups:   id [6]
#       id   val distinctValues
#    <dbl> <dbl>          <int>
#  1     1   100              0
#  2     1   100              0
#  3     2   200              1
#  4     2   300              1
#  5     3   400              0
#  6     4   500              1
#  7     4   500              1
#  8     5   500              1
#  9     5   600              1
# 10     5   600              1
# 11     6   200              2
# 12     6   200              2
# 13     6   300              2
# 14     6   500              2

您也可以使用 distinctValues = sum(unique(val) %in% c) 如果这看起来更清楚 - 它可能效率稍低,但除非您的数据量很大,否则不足以影响。

对于n_distinct,我们需要在行的子集上应用

library(dplyr)
df %>% 
    group_by(id) %>% 
    mutate(distinctValues = n_distinct(val[val %in% c]))

-输出

# A tibble: 14 x 3
# Groups:   id [6]
#      id   val distinctValues
#   <dbl> <dbl>          <int>
# 1     1   100              0
# 2     1   100              0
# 3     2   200              1
# 4     2   300              1
# 5     3   400              0
# 6     4   500              1
# 7     4   500              1
# 8     5   500              1
# 9     5   600              1
#10     5   600              1
#11     6   200              2
#12     6   200              2
#13     6   300              2
#14     6   500              2