将值应用于相同 R 的 ID

Apply value to ID's that are the same R

以下面的数据集为例:

  id flag
1  1    Y
2  1     
3  1     
4  2     
5  2    Y
6  3    Y

可重现的例子:

df <- data.frame(id=factor(c(1,1,1,2,2,3)), flag=c('Y','','','','Y','Y'))

如果任何 ID 都存在标志 = Y,那么我希望所有 ID 都具有标志 "Y",因此上面的示例如下所示:

  id flag
1  1    Y
2  1    Y
3  1    Y
4  2    Y
5  2    Y
6  3    Y

使用 dplyr 的解决方案是

library(dplyr)

df %>% 
  group_by(id) %>% 
  mutate(flag_new = ifelse(any(flag == "Y"), "Y", as.character(flag)))

# A tibble: 6 x 3
# Groups:   id [3]
  id    flag  flag_new
  <fct> <fct> <chr>   
1 1     Y     Y       
2 1     ""    Y       
3 1     ""    Y       
4 2     ""    Y       
5 2     Y     Y       
6 3     ""    ""      

或使用data.table,将'data.frame'转换为'data.table'(setDT(df)),按'id'分组,获取行ID(.I) 在 "Y" %in% 'flag' 列中,将其用作 i 并分配 (:=) 'flag' 元素'id' 到 "Y"

library(data.table)
setDT(df)[df[, .I["Y" %in% flag], id]$V1, flag := "Y"][]
#   id flag
#1:  1    Y
#2:  1    Y
#3:  1    Y
#4:  2    Y
#5:  2    Y
#6:  3     

数据

df <- data.frame(id=factor(c(1,1,1,2,2,3)), flag=c('Y','','','','Y',''))

如果要保留没有 'Y' 的组,则必须使用不同的方法。

df <- data.frame(id=factor(c(1,1,1,2,2,3,3,3)), flag=c('Y','','','','Y','Z', 'G', ''))
#   id flag
# 1  1    Y
# 2  1     
# 3  1     
# 4  2     
# 5  2    Y
# 6  3    Z
# 7  3    G
# 8  3     

# Thanks @akrun, for rewriting to avoid using "do" function
df %>% 
  group_by(id) %>% 
  mutate(flag_new = if(any(flag == "Y")) "Y" else as.character(flag))

#   id    flag  flag_new
#   <fct> <fct> <chr>   
# 1 1     Y     Y       
# 2 1     ""    Y       
# 3 1     ""    Y       
# 4 2     ""    Y       
# 5 2     Y     Y       
# 6 3     Z     Z       
# 7 3     G     G       
# 8 3     ""    ""

已接受的答案:

df %>% 
  group_by(id) %>% 
  mutate(flag_new = ifelse(any(flag == "Y"), "Y", as.character(flag)))
#   id    flag  flag_new
#   <fct> <fct> <chr>   
# 1 1     Y     Y       
# 2 1     ""    Y       
# 3 1     ""    Y       
# 4 2     ""    Y       
# 5 2     Y     Y       
# 6 3     Z     Z       
# 7 3     G     Z       
# 8 3     ""    Z