基于多个其他列的一列的最大值

时间:2018-04-29 23:10:03

标签: r max dummy-variable

我猜这个问题非常具体。

我正在寻找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行。 谢谢!

3 个答案:

答案 0 :(得分:2)

此处尝试使用ave,但此逻辑适用于您可能知道的任何分组功能。按组查找NA,查看它们是否为! / Negateall 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