Прямое использование 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 "" "" "" ""')