r - 根据列的第一个值对所有行进行子集化

标签 r if-statement subset

我遇到了一个子集问题,我一直在解决这个问题。这是数据片段:

UniqueID MonthYear FirstObs
ABC123   OCT-18    1
ABC123   NOV-18    0
ABC123   JAN-19    0
ABC123   FEB-19    0
DEF446   MAY-19    1
DEF456   JUN-19    0
DEF456   JUL-19    0
GHI789   OCT-18    1
GHI789   NOV-18    0

数据集非常大,并且有一系列与上面的示例类似的行。我希望能够编写一个子集公式,该公式提取具有相同 UniqueID block 的每一行,这些 block 以 FirstObs=1 开头,并根据它们起源的月份将它们放在一起。我想要如下的东西:

Subset1 (all uniqueIDs that originated in October)
UniqueID MonthYear FirstObs
ABC123   OCT-18    1
ABC123   NOV-18    0
ABC123   JAN-19    0
ABC123   FEB-19    0
GHI789   OCT-18    1
GHI789   NOV-18    0


Subset2 (all uniqueIDs that originated in May)
UniqueID MonthYear FirstObs    
DEF446   MAY-19    1
DEF456   JUN-19    0
DEF456   JUL-19    0

理想情况下,我会为每个月以 FirstObs=1 开头的每个 block 都有一个子集。我知道我需要使用一些 ifelse 和子集函数,但我不确定如何以最佳方式使用它们。

最佳答案

这可能有帮助

library(dplyr)
df2 <- df1 %>% 
     group_by(UniqueID) %>% 
     filter(first(FirstObs) == 1 & n() > 1)
df3 <- anti_join(df1, df2)

也可以

library(stringr)
df2 <- df1 %>%
          group_by(UniqueID) %>% 
          filter(first(FirstObs) == 1, 
                str_remove(first(MonthYear), "-\\d+") == "OCT")
df3 <- anti_join(df1, df2)

或者分割到data.frames的列表

df1 %>%
   group_by(UniqueID) %>%
   mutate(grp = first(FirstObs) == 1 & n() > 1) %>%
   ungroup %>%
   group_split(grp, keep = FALSE)
#[[1]]
# A tibble: 3 x 3
#  UniqueID MonthYear FirstObs
#  <chr>    <chr>        <int>
#1 DEF446   MAY-19           1
#2 DEF456   JUN-19           0
#3 DEF456   JUL-19           0

#[[2]]
# A tibble: 6 x 3
#  UniqueID MonthYear FirstObs
#  <chr>    <chr>        <int>
#1 ABC123   OCT-18           1
#2 ABC123   NOV-18           0
#3 ABC123   JAN-19           0
#4 ABC123   FEB-19           0
#5 GHI789   OCT-18           1
#6 GHI789   NOV-18           0

数据

df1 <- structure(list(UniqueID = c("ABC123", "ABC123", "ABC123", "ABC123", 
"DEF446", "DEF456", "DEF456", "GHI789", "GHI789"), MonthYear = c("OCT-18", 
"NOV-18", "JAN-19", "FEB-19", "MAY-19", "JUN-19", "JUL-19", "OCT-18", 
"NOV-18"), FirstObs = c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L)), 
class = "data.frame", row.names = c(NA, 
-9L))

关于r - 根据列的第一个值对所有行进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59670261/

相关文章:

if-statement - Lua 中的链式逻辑操作

r - 嵌套 ifelse 条件顺序不同的不同结果

r - 获取向量的最后一个元素

r - 在 R 中向量化一个简单的循环

r - 在 R、Rmd、knitr、bookdown 中打印 UTF-8 字符

r - 如何重现H2o GBM类概率计算

r - vim-rmarkdown 插件配置

swift - 使用 if 语句访问结构中的枚举值

python - 查找列表的索引,该列表是列表列表中的子集

r - R 中 data.frames 列表的子集