【问题标题】:subset R dataframe using multiple functions/constraints [duplicate]使用多个函数/约束的子集 R 数据帧
【发布时间】:2021-10-30 22:12:48
【问题描述】:

我想分两步对数据框 (dat) 进行子集化。第一个约束:保持唯一的“id”。第二个约束:保持最小的“访问”。 例如,对于 id=S2,我想保留访问 #1 的第 3 行,而不是访问 #2 的第 2 行。

set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(id=c("s1","s2","s2","s3","s4","s4"), 
                  date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  visit=1:2,
                  age=sample(18:30, n, replace=TRUE))

#dat
# id       date visit age
# 1 s1 2020-12-26     1  18
# 2 s2 2020-12-27     2  22
# 3 s2 2020-12-28     1  18
# 4 s3 2020-12-29     2  26
# 5 s4 2020-12-30     1  27
# 6 s4 2020-12-31     2  21

#desired output:
# id       date visit age 
# 1 s1 2020-12-26     1  18    
# 3 s2 2020-12-28     1  18    
# 4 s3 2020-12-29     2  26    
# 5 s4 2020-12-30     1  27    

【问题讨论】:

  • 使用dplyrdat %&gt;% group_by(id) %&gt;%slice(which.min(visit))
  • 好发现,@RonakShah,我知道某处有骗子......

标签: r dataframe subset multiple-columns


【解决方案1】:

基础 R

dat[ave(dat$visit, dat$id, FUN = function(z) seq_along(z) == which.min(z)) > 0,]
#   id       date visit age
# 1 s1 2020-12-26     1  18
# 3 s2 2020-12-28     1  18
# 4 s3 2020-12-29     2  26
# 5 s4 2020-12-30     1  27

dplyr

library(dplyr)
dat %>%
  group_by(id) %>%
  slice(which.min(visit)) %>%
  ungroup()
# # A tibble: 4 x 4
#   id    date       visit   age
#   <chr> <date>     <int> <int>
# 1 s1    2020-12-26     1    18
# 2 s2    2020-12-28     1    18
# 3 s3    2020-12-29     2    26
# 4 s4    2020-12-30     1    27

数据表

library(data.table)
as.data.table(dat)[, .SD[which.min(visit),], by = id]
#        id       date visit   age
#    <char>     <Date> <int> <int>
# 1:     s1 2020-12-26     1    18
# 2:     s2 2020-12-28     1    18
# 3:     s3 2020-12-29     2    26
# 4:     s4 2020-12-30     1    27

【讨论】:

    【解决方案2】:

    这似乎是语法最简单的解决方案:

    library(dplyr)
    
    dat %>%
      group_by(id) %>%
      filter(age == min(age))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-08
      • 2020-02-17
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      相关资源
      最近更新 更多