R-需要添加一个标志,其中代码标识列中缺少的值

R-需要添加一个标志,其中代码标识列中缺少的值,r,R,不确定标题是否清晰,但我希望添加一列,用于标识名称列中的名称值可能在该组中丢失的组。样本数据 Group ID Ind ID Name 100 1 Andy 100 1 Mike 100 2 Mike 200 1 Mike 200 2 Mike 300 1 Andy 300 1 Mike 400

不确定标题是否清晰,但我希望添加一列,用于标识名称列中的名称值可能在该组中丢失的组。样本数据

 Group ID  Ind ID  Name
 100       1       Andy
 100       1       Mike
 100       2       Mike
 200       1       Mike
 200       2       Mike
 300       1       Andy
 300       1       Mike
 400       1       Mike    
 400       2       Mike    
 400       3       Mike    
 400       4       Mike    
我想添加第四列,该列将显示“Andy”是否不在组中。所以

 Group ID  Ind ID  Name  Andy?
 100       1       Andy    Y
 100       1       Mike    Y
 100       2       Mike    Y
 200       1       Mike    N
 200       2       Mike    N
 300       1       Andy    Y
 300       2       Mike    Y
 400       1       Mike    N
 400       2       Mike    N
 400       3       Mike    N
 400       4       Mike    N
我最初的想法是对数据进行分区,然后循环查找name列中是否提到了我要标记的名称

我对分区使用了split()——5分钟后,它仍在运行。我确实有600000多行,其中可能有500000行是唯一的组ID


关于如何处理的任何建议?

您可以使用数据表和
Any()
,使用
GroupID
作为分组变量

library(data.table)
setDT(df)[, "Andy?" := any(Name == "Andy"), by = GroupID]

 #     GroupID IndID Name Andy?
 #  1:     100     1 Andy  TRUE
 #  2:     100     1 Mike  TRUE
 #  3:     100     2 Mike  TRUE
 #  4:     200     1 Mike FALSE
 #  5:     200     2 Mike FALSE
 #  6:     300     1 Andy  TRUE
 #  7:     300     1 Mike  TRUE
 #  8:     400     1 Mike FALSE
 #  9:     400     2 Mike FALSE
 # 10:     400     3 Mike FALSE
 # 11:     400     4 Mike FALSE
或者,对于
Andy?
列中的
Y
N
,您可以使用

setDT(df)[, "Andy?" := ifelse(any(Name == "Andy"), "Y", "N"), by = GroupID]
基本的R方法是使用
ave()
,尽管考虑到
data.table
dplyr
的简单高效,这似乎并不太理想

df[["Andy?"]] <- with(df, {
    ave(as.character(Name), GroupID, FUN = function(x) {
        ifelse(any(x == "Andy"), "Y", "N")
    })
})
df[[“Andy?”]输入数据:

dat <- read.table(header=TRUE, 
##   text=
##  "Group_ID  Ind_ID  Name  Andy?
##  100       1       Andy    Y
##  100       1       Mike    Y
##  100       2       Mike    Y
##  200       1       Mike    N
##  200       2       Mike    N
##  300       1       Andy    Y
##  300       2       Mike    Y
##  400       1       Mike    N
##  400       2       Mike    N
##  400       3       Mike    N
##  400       4       Mike    N")

要对这么多的组进行分组,您需要查看data.table包,或者可能是dplyr。对于大量这样的小团体来说,前者可能会更快。实际上,我目前正在使用dplyr来聚合数据/汇总值。我不知道如何合并这个,尽管使用dplyrI我会看看。谢谢嗨,理查德。你想粘贴那篇文章吗?谢谢你的修改!现在看看
ave
解决方案并不可怕,但在这个特定的例子中它很笨重。@Richard Scriven-您以前使用过dplyr并删除了它。有什么原因让你觉得不值得分享吗?更奇怪的是,我正在使用dplyralready@AndyD我删除了它,因为Ben Bolker发布了基本相同的东西。
library("dplyr")
dat %>% group_by(Group_ID) %>%
    mutate(`Andy?` = "Andy" %in% Name)

## Source: local data frame [11 x 5]
## Groups: Group_ID
## 
##    Group_ID Ind_ID Name Andy. Andy?
## 1       100      1 Andy     Y  TRUE
## 2       100      1 Mike     Y  TRUE
## ...