Вы можете сделать это, используя 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")
EDITED-
Этого можно достичь без 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