【问题标题】:Merge rows in big dataset based on common values基于共同值合并大数据集中的行
【发布时间】:2020-09-29 00:12:03
【问题描述】:

我有 54,000 行和 500 列的数据,但特定列“政策编号”中的许多值具有相同的政策编号,因为数据集包括货币价值发生变化的任何时间(但最重要的 100列具有相同的值)。 (主数据集命名为Home)

数据集示例:

Total Claim    Claim number  Type of Loss   Date  .....  

$45,000          3500           Fire         2001 ....

$45,000          3500           Fire         2002 ....

$45,000          3500           Water        2001 ....

我想要的是将具有相同编号的所有声明连接在一起作为一行,如果一列具有不同的值,则将它们与中间的逗号组合在一起。

我想要的结果示例:

Total Claim    Claim number   Type of Loss   Date.....  

$45,000          3500          Fire, Water    2001, 2002  ...

我尝试过聚合、合并和 rbind,但我认为我编码错误,因为它不起作用。以下是我尝试过的所有不同的代码行。

# Creating a dataset where all the same policy numbers are together

SamePolicy <- aggregate(Home[,3:446], list(Home[,2]), function(x) paste0(unique(x)))
SamePolciy <- merge(data.frame(Home), by="Claim_Number")
SamePolicy <- merge(Home, Home$Total_Claim, by="Claim_Number")
SamePolicy <- aggregate(.~Home$Claim_Number, df, function(x) paste0(unique(x)))

编辑:我有很多列,所以如果可能的话,我不想专门调用每一列来进行编辑?另外,我希望删除列中的重复,所以我只想要 2001,2002 而不是输出 2001,2002,2001。

【问题讨论】:

    标签: r merge aggregate


    【解决方案1】:

    如果您愿意使用dplyr,这是一种选择。将您不想折叠的列放入group_by,所有剩余的列都将被折叠。

    library(dplyr)
    
    df <- tibble(`Total Claim` = rep(45000, 3),
                 `Claim number` = rep(3500, 3),
                 `Type of Loss` = c('Fire', 'Fire', 'Water'),
                 Date = c(2001, 2002, 2001))
    
    df %>%
      group_by(`Total Claim`, `Claim number`) %>%
      summarize_all(.funs = function(X) paste(unique(X), collapse = ','))
    

    编辑:使用列索引号而不是完整的列名添加一个选项

    df %>%
      group_by_at(c(1, 2)) %>%
      summarize_all(.funs = function(X) paste(unique(X), collapse = ','))
    

    【讨论】:

    • 我将两个 cmets 结合起来修复它!谢谢你这帮助了一堆!我已经坚持了一周
    【解决方案2】:

    这是一个可能的data.table 解决方案:

    library(data.table)
    
    setDT(df)
    
    df[ , .(`Total Claim` = mean(`Total Claim`),
            `Type of Loss` = paste(unique(`Type of Loss`), collapse = ","), 
            Date = paste(unique(Date), collapse = ",")), by = `Claim number`]
    

    不清楚您是否希望用逗号分隔不同的货币值,或者您是否希望 Total Claim 的值在 Claim number 中相同。如果值应该相同,则平均值将返回正确的结果。

    这给了我们:

       Claim number Total Claim Type of Loss      Date
    1:         3500       45000   Fire,Water 2001,2002
    

    数据:

    df <- tribble(
      ~`Total Claim`,    ~"Claim number",  ~"Type of Loss",   ~Date,  
    
    45000,          3500,           "Fire",         2001, 
    
    45000,          3500,           "Fire",         2002,
    
    45000,          3500,           "Water",        2001 
    )
    

    【讨论】:

    • 总索赔在每个不同的保单编号中是相同的数字,因此将是相同的。我怎样才能摆脱列表中的重复日期和丢失类型?感谢您的帮助!
    • 刚刚更新了帖子 - 你只需要在Type of LossDate之前添加unique,所以它只会返回唯一值。
    • 谢谢!所以还有一个问题,我在日期之后有数百行,有没有一种方法可以使用这个函数来粘贴唯一值而不命名每个列?我有大约 500 列。
    • 我对@9​​87654330@ 还很陌生,所以我现在没有解决方案,但我会尽快解决。如果您找到解决方案,请更新并告诉我!
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 2021-08-07
    • 2015-07-14
    • 1970-01-01
    • 2020-07-13
    • 2019-03-26
    • 2019-06-11
    • 2011-09-12
    相关资源
    最近更新 更多