【问题标题】:Maximum values of one column based on multiple other columns基于多个其他列的一列的最大值
【发布时间】:2018-04-29 23:10:03
【问题描述】:

我猜这个问题很具体。

我正在寻找Stata egen函数的R等价物,特别是

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

首先,我想生成一个等于 1 的虚拟对象,如果名称不是 NA 并且我认为

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 行。 谢谢!

【问题讨论】:

  • 谢谢,但似乎没有用。 complete.cases(ID,year,names) 返回 [1] TRUE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE 这不是我想要的。
  • 你想要!with(dat, ave(is.na(names), list(ID,year), FUN=all)) 或类似的吗? datdat &lt;- data.frame(ID,year,names, stringsAsFactors=FALSE)
  • @thelatemail 是的,也许问题不是很清楚,但这会返回正确的结果。我试图查看帮助页面,但我并不完全清楚为什么会这样。你能解释一下为什么我们用 FUN=all 取平均值吗?编辑:下面已经回答了

标签: r max dummy-variable


【解决方案1】:

这是使用ave 的尝试,但此逻辑适用于您可能知道的任何分组函数。按组查找NAs,看看是不是(!/Negate)allTRUE

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)

【讨论】:

  • 为什么不ave(!is.na(dat[["names"]]), dat[c("ID","year")], FUN=all)
  • @Onyambu - 当然。只是个人喜好,但这也可以。
【解决方案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)

【讨论】:

    【解决方案3】:

    我不熟悉 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多