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
## ...