【问题标题】:Delete or Keep observations by factor from another variable funtion从另一个变量函数中按因子删除或保留观察值
【发布时间】:2018-01-05 02:49:05
【问题描述】:

我只想按 ID 保留具有 3 个或更多实例的观察结果。或者,另一种方式,按 ID 删除少于 3 个实例的观察。样本数据:

Instances <- data.frame(ID=c(111111, 111111, 111111, 111111, 
222222, 222222,
333333, 333333, 333333), 
INSTANCE=c(1,2,3,4,1,2,1,2,3), 
AMOUNT=c(100,120,108,112, 60, 65, 85, 90, 101))

Instances$ID <- as.factor(Instances$ID)
Instances$INSTANCE <- as.factor(Instances$INSTANCE)

从这个样本中,我预计会返回来自 ID 111111 和 333333 的所有观察结果,但不会返回来自 222222 的所有观察结果。

我确信我可以通过 ID 创建 magrittr 中的管道功能。 当我尝试这样做时,我无法将 INSTANCE > 3 的功能与 ID 绑定。我仍然在理解 %>% 并且仍在阅读它,但与此同时,任何关于为什么/如何工作的帮助和潜在解释将不胜感激。在外面保持温暖。

【问题讨论】:

  • Instances[ave(rep(1, nrow(Instances)), Instances$ID, FUN = length) &gt;= 3,] 怎么样?

标签: r


【解决方案1】:

基础溶液

a_x <- ave(Instances$INSTANCE,
           Instances$ID,
           FUN = max)

Instances[a_x >= 3,]

      ID INSTANCE AMOUNT
1 111111        1    100
2 111111        2    120
3 111111        3    108
4 111111        4    112
7 333333        1     85
8 333333        2     90
9 333333        3    101

使用 dplyr:

library(dplyr) 

Instances %>%
  group_by(ID) %>%
  mutate(max_instance = max(INSTANCE)) %>%
  filter(max_instance >= 3) %>%
  select(-max_instance)

      ID INSTANCE AMOUNT
1 111111        1    100
2 111111        2    120
3 111111        3    108
4 111111        4    112
7 333333        1     85
8 333333        2     90
9 333333        3    101

数据(注意我没有将IDINSTANCE 转换为因子)

Instances <- data.frame(ID=c(111111, 111111, 111111, 111111, 
222222, 222222,
333333, 333333, 333333), 
INSTANCE=c(1,2,3,4,1,2,1,2,3), 
AMOUNT=c(100,120,108,112, 60, 65, 85, 90, 101))

【讨论】:

  • 有趣的是我已经创建了一个我忘记的 Max Instance 变量,dat$MaxPayInstance
  • 为什么这个 dplyr 版本会把这个函数变成“A Tibble”? dat%>% count(Termed)
【解决方案2】:

正如我在之前的评论中所发布的,无论Instances$INSTANCE 的数据结构如何,这都应该有效。我使用 ave 并创建一个 1 的向量来总结:

Instances[ave(rep(1, nrow(Instances)), Instances$ID, FUN = length) >= 3,]

#      ID INSTANCE AMOUNT
#1 111111        1    100
#2 111111        2    120
#3 111111        3    108
#4 111111        4    112
#7 333333        1     85
#8 333333        2     90
#9 333333        3    101

【讨论】:

    【解决方案3】:

    这会使用 dplyr::n() 函数对每个 ID 进行计数,将其命名为“size”并返回 size > 2 的那些:

    library(dplyr)
    Instances  %>% group_by(ID) %>% mutate(size=n()) %>% filter(size>2)
    
    # A tibble: 7 x 4
    # Groups:   ID [2]
          ID INSTANCE AMOUNT  size
      <fctr>   <fctr>  <dbl> <int>
    1 111111        1    100     4
    2 111111        2    120     4
    3 111111        3    108     4
    4 111111        4    112     4
    5 333333        1     85     3
    6 333333        2     90     3
    7 333333        3    101     3
    

    如果我一直使用ave,我会尝试:ave(Instances$ID, Instances$ID, FUN=length)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多