仅返回基于另一个变量的第一个实例

时间:2016-12-08 19:09:34

标签: r

我有一个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

4 个答案:

答案 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.

  • apply1作为第二个参数循环遍历a的行 数据框,将功能应用于每一行。
  • subset选择符合条件的行。在这种情况下, 我们正在寻找与当前行具有相同ID的行,以及 保持&#34; Y&#34;。
  • &结合条件
  • nrow获取行数