首页 > 解决方案 > 分组,聚合以根据条件创建新列

问题描述

这是数据

DPS Comodity    Std Issue
111 Hard drive  No Post
111 MBD         NoBoot
111 LCD         Flicker
222 MBD         No Post
222 LCD         No Post
333 MBD         No power

我必须得到以下格式

DPS Comodity            Std Issue
111 Hard drive,MBD,LCD  Hard drive-No Post,MBD-NoBoot,LCD-Flicker
222 MBD,LCD                 No Post
333 MBD                 No Power

我已经尝试过aggregate(Std Issue~DPS,df,function(x)toString(uniqe(x))),但它导致标准问题为

No Post,No Boot, Flicker
No Post
No Power

这不符合我的要求,任何解决此类问题的建议都将非常有帮助和赞赏。

aggregate(Std Issue~DPS,df,function(x)toString(uniqe(x)))

或者

这是预期的结果

DPS Comodity            Std Issue
111 Hard drive,MBD,LCD  Hard drive-No Post,MBD-NoBoot,LCD-Flicker
222 MBD,LCD                 No Post
333 MBD                 No Power

标签: r

解决方案


您可以通过使用data.tablepackage-

  > library(data.table)
  > setDT(dt)[,Std_Issue:=paste0(Comodity,"-",Std.Issue)]
  > setDT(dt)[, list(Comodity = paste(Comodity, collapse=","),
             `Std Issue` = paste(Std_Issue, collapse=",")), by = DPS]

输出-

DPS           Comodity                                 Std Issue
1: 111 Hard drive,MBD,LCD     Hard drive-No Post,MBD-NoBoot,LCD-Flicker
2: 222            MBD,LCD                   MBD-No Post,LCD-No Post
3: 333                MBD                              MBD-No power

输入数据-

dt <- read.table(text="DPS  Comodity    Std Issue
111 Hard drive  No Post
                 111    MBD NoBoot
                 111    LCD Flicker
                 222    MBD No Post
                 222    LCD No Post
                 333    MBD No power",header=T,sep="\t")

已编辑-

您可以在没有 - 的情况下使用for loop-

> setDT(dt)[,Std_Issue:=paste0(Comodity,"-",Std.Issue)]
> setDT(dt)[, list(Std_issue = ifelse(length(unlist(unique(lapply(str_split(Std_Issue,"-"),function(x)x[2]))))<3,paste(unique(`Std.Issue`), collapse=","),paste(Std_Issue, collapse=",")),Commodity=paste(Comodity, collapse=",")), by=DPS]

   DPS                            Std_issue                  Commodity
1: 111       Hard drive-No Post,MBD-NoBoot,LCD-Flicker   Hard drive,MBD,LCD
2: 222                              No Post                   MBD,LCD
3: 333                              No power                    MBD

推荐阅读