以下面的数据集为例:
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
答案 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',''))