我有一个ID列表(有些是重复的),我有一个KEEP
变量。如果在KEEP列中有这样的实例,我想创建一个1或0的列,即使它不是那个特定的列
id <- c(101,101,101,102,102,102,103,103,103,104,104,106,107,108)
keep <- c("Y",0,0,"Y",0 ,0 ,"Y" ,0 ,0 ,0 ,0 ,0 ,0 ,0)
df <- data.frame(id, keep)
如果匹配的所有ID的保留列中都有一个Y,我想创建第三列为1的列。
看起来应该是这样的。
> df
id keep countkeep
1 101 Y 1
2 101 0 1
3 101 0 1
4 102 Y 1
5 102 0 1
6 102 0 1
7 103 Y 1
8 103 0 1
9 103 0 1
10 104 0 0
11 104 0 0
12 106 0 0
13 107 0 0
14 108 0 0
答案 0 :(得分:8)
library(dplyr)
df %>% group_by(id)%>% mutate(countkeep = ifelse(any(keep=="Y"),1,0))
id keep countkeep
<dbl> <fctr> <dbl>
1 101 Y 1
2 101 0 1
3 101 0 1
4 102 Y 1
5 102 0 1
6 102 0 1
7 103 Y 1
8 103 0 1
9 103 0 1
10 104 0 0
11 104 0 0
12 106 0 0
13 107 0 0
14 108 0 0
答案 1 :(得分:4)
我们可以使用data.table
library(data.table)
setDT(df)[, countkeep := +(any(keep=="Y")), id]
df
# id keep countkeep
# 1: 101 Y 1
# 2: 101 0 1
# 3: 101 0 1
# 4: 102 Y 1
# 5: 102 0 1
# 6: 102 0 1
# 7: 103 Y 1
# 8: 103 0 1
# 9: 103 0 1
#10: 104 0 0
#11: 104 0 0
#12: 106 0 0
#13: 107 0 0
#14: 108 0 0
或使用base R
df$countkeep <- with(df, as.integer(ave(keep=="Y", id, FUN = any)))
或table
transform(df, countkeep = +(id %in% names(na.omit(NA^!table(df)[,"Y"]))))
答案 2 :(得分:3)
如果您想要一个基本答案,这个也应该有效。
df$countkeep <- ifelse(df$id %in% df$id[which(df$keep == "Y")], 1, 0)
> df
id keep countkeep
1 101 Y 1
2 101 0 1
3 101 0 1
4 102 Y 1
5 102 0 1
6 102 0 1
7 103 Y 1
8 103 0 1
9 103 0 1
10 104 0 0
11 104 0 0
12 106 0 0
13 107 0 0
14 108 0 0
答案 3 :(得分:0)
这可能是一种更优雅的方式,但这有效:
df$countkeep <- apply(df,1,function(x){
if(nrow(subset(df,id==x[1] & keep=="Y"))==1)
1
else
0
})
工作原理:
概述:我们会查看df行。如果有一行有此行的ID,并且&#34; Y&#34;保留时,将此行countkeep
标记为1.如果没有id
和&#34; Y&#34;的实例,请标记为0.