我怎样才能转到a";“表格”;R格式?
是否有一种简单的方法可以转换为表格格式(只保留父级一次)?我知道目标格式在数据科学中并不好。但它使报告易于阅读。我可以很容易地把它写成excel,然后把报告寄给我的老板我怎样才能转到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"),
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)
dtdt[,lapply(.SD,函数(x){x[duplicated(x)]@alistaireduplicated()
如果一个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
")