как скопировать несколько переменных в столбцы - PullRequest
0 голосов
/ 25 июня 2019

Я хотел бы скопировать несколько переменных в столбцы.В настоящее время у меня есть такие данные.

   date      bundle_name  totbund   prod1  totprod1  prod2  totprod2  
06/01/2019      a_bund       1        a       1        b       1
06/01/2019        a          1
06/01/2019        b          2
07/01/2019      b_bund       1        b       2
07/01/2019      b_bund       2        b       4
07/01/2019        b          2

, чтобы быть похожим на это

   date      bundle_name  totbund   prod1  totprod1  prod2  totprod2  
06/01/2019      a_bund       1        a       1        b       1
06/01/2019        a          1        a       1
06/01/2019        b          2        b       2
07/01/2019      b_bund       1        b       2
07/01/2019      b_bund       2        b       4
07/01/2019        b          2        b       2

Итак, я хотел бы скопировать данные в bundle_name в prod1 и данные в Totbund в Totprod1, если Prod1и столбцы totprod1 этой строки пусты.Есть ли способ сделать это?Большое спасибо заранее

1 Ответ

0 голосов
/ 25 июня 2019

Прямое использование ifelse:

x$prod1 <- ifelse(is.na(x$prod1) | !nzchar(x$prod1), x$bundle_name, x$prod1)
x$totprod1 <- ifelse(is.na(x$totprod1) | !nzchar(x$totprod1), x$totbund, x$totprod1)

x
#         date bundle_name totbund prod1 totprod1 prod2 totprod2
# 1 06/01/2019      a_bund       1     a        1     b        1
# 2 06/01/2019           a       1     a        1             NA
# 3 06/01/2019           b       2     b        2             NA
# 4 07/01/2019      b_bund       1     b        2             NA
# 5 07/01/2019      b_bund       2     b        4             NA
# 6 07/01/2019           b       2     b        2             NA

Поскольку вы упомянули конвейер (не уверен, что вы имеете в виду):

dplyr

library(dplyr)
x %>%
  mutate(
    prod1 = if_else(is.na(prod1) | !nzchar(prod1), bundle_name, prod1),
    totprod1 = if_else(is.na(totprod1) | !nzchar(totprod1), totbund, totprod1)
  )
#         date bundle_name totbund prod1 totprod1 prod2 totprod2
# 1 06/01/2019      a_bund       1     a        1     b        1
# 2 06/01/2019           a       1     a        1             NA
# 3 06/01/2019           b       2     b        2             NA
# 4 07/01/2019      b_bund       1     b        2             NA
# 5 07/01/2019      b_bund       2     b        4             NA
# 6 07/01/2019           b       2     b        2             NA

data.table

library(data.table)
library(magrittr)
xDT <- x
setDT(xDT)
xDT %>%
  .[, totprod1 := ifelse(is.na(totprod1) | !nzchar(totprod1), totbund, totprod1) ] %>%
  .[, prod1    := ifelse(is.na(prod1) | !nzchar(prod1), bundle_name, prod1) ] %>%
  .[]
#          date bundle_name totbund prod1 totprod1 prod2 totprod2
# 1: 06/01/2019      a_bund       1     a        1     b        1
# 2: 06/01/2019           a       1     a        1             NA
# 3: 06/01/2019           b       2     b        2             NA
# 4: 07/01/2019      b_bund       1     b        2             NA
# 5: 07/01/2019      b_bund       2     b        4             NA
# 6: 07/01/2019           b       2     b        2             NA

(Конечный %>% .[] предназначен лишь для того, чтобы заставить его печатать на консоли, ненужного в производстве.)


Пример данных.Я добавил пустые строки "", чтобы попытаться имитировать то, что у вас есть в вашем вопросе, но я не уверен, выглядит ли это так, потому что у вас на самом деле есть пустые строки (и все числа действительно строки) или если вы просто набираете егов ручную, чтобы она выглядела хорошо.NA s выводится буквой R, потому что в первой строке данных есть числа, а пустые строки там не имеют значения.

x <- read.table(header = TRUE, stringsAsFactors = FALSE, text='
   date      bundle_name  totbund   prod1  totprod1  prod2  totprod2  
06/01/2019      a_bund       1        a       1        b       1
06/01/2019        a          1       ""      ""       ""      ""
06/01/2019        b          2       ""      ""       ""      ""
07/01/2019      b_bund       1        b       2       ""      ""
07/01/2019      b_bund       2        b       4       ""      ""
07/01/2019        b          2       ""      ""       ""      ""')
...