r - 分组,聚合以根据条件创建新列
问题描述
这是数据
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
解决方案
您可以通过使用data.table
package-
> 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
推荐阅读
- python - 无法重新创建范围函数以在负步骤中打印列表。它还打印一个额外的数字
- react-native - React Native Android - 如何在 StackNavigator 中禁用 android 后退按钮
- sql-server - 从 SQL Server 2008 升级到 2016 使查询变慢
- bosch-iot-suite - 提取的jar文件找不到主类
- mysql - 如何在 MYSQL 中将 ISO8601 时间转换为日期时间
- python - 在 python 3 中创建一个序列
- swift - 电话号码的自定义 Swift 格式化程序
- python - 更改活动窗口
- sql - Postgres 数据类型声明和键入,双冒号和非冒号有什么区别
- azure - Azure 默认变量未在表达式中求值