我怎样才能转到a";“表格”;R格式?

我怎样才能转到a";“表格”;R格式?,r,dplyr,data.table,tidyverse,R,Dplyr,Data.table,Tidyverse,是否有一种简单的方法可以转换为表格格式(只保留父级一次)?我知道目标格式在数据科学中并不好。但它使报告易于阅读。我可以很容易地把它写成excel,然后把报告寄给我的老板 library(data.table) (dt <- data.table(Parent_Product=c("A","A","A","B","B","B"), Sub_Product=c("red","red","blue","yellow","pink","pink"),

是否有一种简单的方法可以转换为表格格式(只保留父级一次)?我知道目标格式在数据科学中并不好。但它使报告易于阅读。我可以很容易地把它写成excel,然后把报告寄给我的老板

library(data.table)
(dt <- data.table(Parent_Product=c("A","A","A","B","B","B"),
                 Sub_Product=c("red","red","blue","yellow","pink","pink"),
                 Sub_Product1=c(1,2,3,4,5,6),
                 Value=c(100,200,300,400,500,600)))

#>    Parent_Product Sub_Product Sub_Product1 Value
#> 1:              A         red            1   100
#> 2:              A         red            2   200
#> 3:              A        blue            3   300
#> 4:              B      yellow            4   400
#> 5:              B        pink            5   500
#> 6:              B        pink            6   600

(target_dt <- data.table(Parent_Product=c("A",NA,NA,"B",NA,NA),
                        Sub_Product=c("red",NA,"blue","yellow","pink",NA),
                        Sub_Product1=c(1,2,3,4,5,6),
                        Value=c(100,200,300,400,500,600)))

#>    Parent_Product Sub_Product Sub_Product1 Value
#> 1:              A         red            1   100
#> 2:           <NA>        <NA>            2   200
#> 3:           <NA>        blue            3   300
#> 4:              B      yellow            4   400
#> 5:           <NA>        pink            5   500
#> 6:           <NA>        <NA>            6   600
库(data.table)
(dt父产品子产品子产品1值
#>1:红色1100
#>2:红色2200
#>3:蓝色的3300
#>4:B黄色4400
#>5:B粉红色5500
#>6:B粉红色6600
(目标\u dt父产品子产品\u产品子产品1值
#>1:红色1100
#> 2:                               2   200
#>3:蓝色3300
#>4:B黄色4400
#>5:粉红色5500
#> 6:                               6   600

这可能会整合到更少的步骤中,但至少每个步骤中发生的事情都是透明的:

库(data.table)
dt 1至NA
dt[idx_父项>1,父项产品:=NA]
dt[idx_Sub>1,Sub_乘积:=NA]
#清除idx
dt[,`:=`(idx\u父项=NULL,idx\u子项=NULL)]
#报告值
dt
#>父产品子产品子产品1值
#>1:红色1100
#> 2:                               2   200
#>3:蓝色3300
#>4:B黄色4400
#>5:粉红色5500
#> 6:                               6   600
由(v0.2.1)于2019-02-08创建,以下是以下内容和建议的组合:

dt[, lapply(.SD, function(x) {x[rowid(rleid(x)) > 1] <- NA; x})]
不幸的是,这会将所有列中的连续值中的任何重复值变为
NA
(或“”等)。对于生产使用,我们可能希望控制应包括哪些列,例如,仅第二列

cols <- "Sub_Product"   # apply to second column for demonstration
dt[, (cols) := lapply(.SD, function(x) {x[rowid(rleid(x)) > 1] <- ""; x}), .SDcols = cols][]
资料 OP的数据已被扩展,包括
母产品
,在
子产品中有第二条
红色
值:

library(data.table)
dt <- fread("
Parent_Product Sub_Product Sub_Product1 Value
             A         red            1   100
             A         red            2   200
             A        blue            3   300
             B      yellow            4   400
             B        pink            5   500
             B        pink            6   600
             C         red            1   100
             C         red            2   100
")
库(data.table)

dt
dt[,lapply(.SD,函数(x){x[duplicated(x)]@alistaire
duplicated()
如果一个
Sub\u产品
再次在另一个
Parent\u产品
的下方出现,则该函数(x){x[duplicated(x)]失败。是的,将其分组更为可靠:
dt duplicated(子产品),子产品:=NA_character_,by=Parent_Product][duplicated(Parent_Product),Parent_Product:=NA_character_][[]重复(Parent_Product),Parent_Product:=NA[/code>Re更少的步骤,我认为rowid有效:
dt[rowid(Parent_Product,Sub_Product)!=1,Sub_Product:=NA];dt[rowid(Parent_Product)!=1,Parent_Product)]
@Frank-neat trick.我一直在使用
data.table
,从它第一次出现就不熟悉
rowid
!谢谢你的提醒。
duplicated.data.table
而不是
duplicated.default
正确处理扩展数据,fwiw:
dt[duplicated(dt,by=c(“父产品”,“子产品”))),Sub_Product:=NA];dt[duplicated(dt,by=“Parent_Product”),Parent_Product:=NA]
。不过,我喜欢您的rowid-rleid方法独立处理每个列(假设排序)。
   Parent_Product Sub_Product Sub_Product1 Value
1:              A         red            1   100
2:                                       2   200
3:                       blue            3   300
4:              B      yellow            4   400
5:                       pink            5   500
6:                                       6   600
7:              C         red            1   100
8:                                       2
cols <- "Sub_Product"   # apply to second column for demonstration
dt[, (cols) := lapply(.SD, function(x) {x[rowid(rleid(x)) > 1] <- ""; x}), .SDcols = cols][]
   Parent_Product Sub_Product Sub_Product1 Value
1:              A         red            1   100
2:              A                        2   200
3:              A        blue            3   300
4:              B      yellow            4   400
5:              B        pink            5   500
6:              B                        6   600
7:              C         red            1   100
8:              C                        2   100
library(data.table)
dt <- fread("
Parent_Product Sub_Product Sub_Product1 Value
             A         red            1   100
             A         red            2   200
             A        blue            3   300
             B      yellow            4   400
             B        pink            5   500
             B        pink            6   600
             C         red            1   100
             C         red            2   100
")