Как я могу перевести в формат "таблицы" в R? - PullRequest
0 голосов
/ 09 февраля 2019

Существует ли простой способ перевода в формат таблицы (только один раз уровень родительского контроля сохраняется)?Я понимаю, что целевой формат не очень хорош в науке о данных.Но это делает отчет легко читаемым.Я могу легко написать это, чтобы преуспеть и отправить отчет своему боссу ..

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вот комбинация предложений Алистера и Фрэнка :

dt[, lapply(.SD, function(x) {x[rowid(rleid(x)) > 1] <- NA; x})]
   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
7:              C         red            1   100
8:           <NA>        <NA>            2    NA

Обратите внимание, что вторая полоса "red" значения в столбце Sub_Product обрабатываются правильно (в отличие от duplicated()).

Чтобы сделать визуальный эффект намного более заметным, мы можем использовать "" вместо NA:

dt[, lapply(.SD, function(x) {x[rowid(rleid(x)) > 1] <- ""; x})]
   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

К сожалению, это превращает любые повторяющиеся значения в последовательности последовательных значений в NA (или "", соответственно) во всех столбцах .Для производственного использования мы, вероятно, хотим контролировать, какие столбцы должны быть включены, например, только второй столбец

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

Данные

Данные OP были расширенывключить Parent_Product "C" с секундной полосой "red" значений в Sub_Product:

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
")
0 голосов
/ 09 февраля 2019

Вероятно, это можно объединить в меньшее количество шагов, но, по крайней мере, это прозрачно, что происходит на каждом шаге:

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))


#create index 1:.N by Parent Product
dt[, idx_Parent := 1:.N, by = .(Parent_Product)]
#ditto for combo of parent product and sub product
dt[, idx_Sub := 1:.N, by = .(Parent_Product, Sub_Product)]
#Update idx > 1 to NA
dt[idx_Parent > 1, Parent_Product := NA]
dt[idx_Sub > 1, Sub_Product := NA]
#clean up idx
dt[, `:=` (idx_Parent = NULL, idx_Sub = NULL)]
#report values
dt
#>    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

Создано в 2019-02-08 с помощью представпакет (v0.2.1)

...