将值应用于相同R的ID

时间:2018-08-15 12:27:36

标签: r if-statement unique-key

以下面的数据集为例:

  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

3 个答案:

答案 0 :(得分:4)

使用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     ""    ""      

答案 1 :(得分:2)

如果要保留不包含'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

答案 2 :(得分:1)

或者使用data.table,将'data.frame'转换为'data.table'(setDT(df)),按'id'分组,获取行ID(.I),其中没有“ Y” %in%“标志”列,将其用作i,并将该“ 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',''))