我猜这个问题非常具体。
我正在寻找R等效的Stata egen功能,特别是
egen max BY varlist。
在我的数据表中,我有一个ID为
的列ID <- c(1,1,2,2,3,4,5,6,6)
带有观察年份的专栏
year <- c(2000,2000,2001,2002,2002,2003,2004,2004,2004)
年份和ID不是唯一的,因为一年内可以有更多的观察结果。
最后我有一个名为
的专栏names <- c("Mark",NA,"John","John",NA,"Sarah","Julia",NA,NA).
首先,如果名字不是NA,我想生成一个等于1的假人,我想
dummy <- ifelse(!is.na(names),1,0)
然后我希望R根据ID和年份返回虚拟的最大值,这在Stata中将是
egen MAX = max(dummy), by(ID year)
实际上,如果所有具有相同ID和年份的行的名称为NA,我希望R返回0。所以我会得到(1,1,1,1,0,1,1,0,0),我可以继续放下第5,7,8行。 谢谢!
答案 0 :(得分:2)
此处尝试使用ave
,但此逻辑适用于您可能知道的任何分组功能。按组查找NA
,查看它们是否为!
/ Negate
)all
TRUE
:
ave(is.na(dat[["names"]]), dat[c("ID","year")], FUN=Negate(all))
#[1] TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE
dat
的位置:
dat <- data.frame(ID,year,names, stringsAsFactors=FALSE)
答案 1 :(得分:2)
我们可以使用tidyverse
library(dplyr)
df1 %>%
group_by(ID, year) %>%
mutate(dummy = as.integer(any(!is.na(names))))
# A tibble: 9 x 4
# Groups: ID, year [7]
# ID year names dummy
# <dbl> <dbl> <fctr> <int>
#1 1.00 2000 Mark 1
#2 1.00 2000 <NA> 1
#3 2.00 2001 John 1
#4 2.00 2002 John 1
#5 3.00 2002 <NA> 0
#6 4.00 2003 Sarah 1
#7 5.00 2004 Julia 1
#8 6.00 2004 <NA> 0
#9 6.00 2004 <NA> 0
df1 <- data.frame(ID, year, names)
答案 2 :(得分:0)
我不熟悉Stata,但根据您的描述,这应该可以解决问题:
mydata <- data.frame(
ID = c(1,1,2,2,3,4,5,6,6),
year = c(2000,2000,2001,2002,2002,2003,2004,2004,2004),
names = c("Mark",NA,"John","John",NA,"Sarah","Julia",NA,NA),
stringsAsFactors = FALSE
)
mydata$dummy <- as.integer(!is.na(mydata$names))
max_dummy <- aggregate(mydata$dummy, mydata[c("ID","year")], max)
has_name <- subset(merge(mydata, max_dummy), x > 0)[-5]
has_name