【问题标题】:filtering specific value with aggregate function in R在 R 中使用聚合函数过滤特定值
【发布时间】:2018-11-25 11:33:17
【问题描述】:

嗨,

我想通过 mccmnc 的前三位来过滤每个客户的最大日期时间值。

如图所示,customer == 'abghsd' 有两个不同的 mccmnc 值“53208”和“53210”。但是,mccmnc 的前三位 是相同的 (532)。所以我想用mccmnc = '532' 过滤客户abghsd 的最大日期时间值。对于customer = 'abbaedl',我需要过滤mccmnc = '623'mccmnc = '451' 的最大日期时间。

请问如何给这个问题提供条件? 通过下面的查询,我可以通过customermccmnc 过滤datetime,但我想过滤mccmnc 的前三位。

processed <- aggregate(datetime ~ customer + mccmnc, data =raw_data3, max)

这是我想要得到的结果:

Customer       datetime mccmnc
abghsd   20181123222022  53210
abbaedl  20181226121213  62330
abbaedl  20181227191919  45123

谢谢。

【问题讨论】:

  • 请提供数据,以便我们为您提供帮助。使用dput(data) 命令并将输出包含在您的问题中
  • 这个算法是什么?只需从mccmnc 中获取前三个值?
  • 您的底层数据结构似乎存在严重问题。例如,mccmnc 总是准确五位数长吗?
  • @RomanLuštrik 是的,我需要从 mccmnc 获取前三个值

标签: r filter dplyr rstudio aggregate


【解决方案1】:

编辑您的原始代码,您只需添加substr()

processed <- aggregate(datetime ~ customer + substr(mccmnc, 1, 3), data = raw_data3, max)
或者,tidyverse 解决方案:

代码

library(tidyverse)
df %>%
    # Group by customer ID and first 3 characters of mccmnc 
    group_by(customer, mccmnc_group = substr(mccmnc, 1, 3)) %>%
    # Get the max datetime per group
    summarise(max_datetime = max(datetime)) %>%
    # Put columns in original order
    select(1, 3, 2)

# A tibble: 3 x 3
# Groups:   customer [2]
  customer     max_datetime mccmnc_group
  <fct>               <dbl> <chr>       
1 John Package     20181201 532         
2 Miranda Nuts     20181227 451         
3 Miranda Nuts     20181226 623         

数据

df <- data.frame(customer = c(rep("John Package", 3), rep("Miranda Nuts", 4)),
           datetime = c(20181123, 20181201, 20181124, 20181125, 20181226, 20181226, 20181227),
           mccmnc = c("532-08", "532-08", "532-10", "623-12", "623-30", "451-21", "451-23"))

> df
      customer datetime mccmnc
1 John Package 20181123 532-08
2 John Package 20181201 532-08
3 John Package 20181124 532-10
4 Miranda Nuts 20181125 623-12
5 Miranda Nuts 20181226 623-30
6 Miranda Nuts 20181226 451-21
7 Miranda Nuts 20181227 451-23

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多