Добавить столбец с тем же префиксом, только если он уже существует в фрейме данных

#r #dataframe #vectorization #dplyr

#r #фрейм данных #векторизация #dplyr

Вопрос:

Вот мой фрейм данных

 df2 <- data.frame(ID = c("1100455", "1100455", "1100455", "1100455", "1100455", "1100464", "1100464"),
                  CATEGORIE = c("10110", "10160", "10604", "11220", "10110", "10110","10140"),
                  RANK =  c("1", "1", "1", "1", "0" ,"1", "1"),
                  MD =  c("0", "0", "0", "3", "4", "0", "0" ),
                  PROD = c(2345.00,1114.58,501.40,0.00,0.00,2720.00,636.80),
                  VALUE = c(540.00,0.00,0.00,0.00,0.00,0.00,0.00),
                  QANT = c(50.00,0.00,5.00,0.00,50.00,0.00,0.00),
                  VALUE3 = c(563.76,0.00,17.35,0.00,0.00,0.00,0.00),
                  PROD3 = c(4100,2100,1740,265,0,3978,940)
)
  

Чего я хочу добиться, так это добавить столбцы в одноименные столбцы, если они заканчиваются номером 3, и если они существуют, например, PROD и PROD3, я могу сделать это так

 df3 <- df2 %>% mutate(PROD = if (exists('PROD3', where=.)) PROD   PROD3 else PROD)
df3 <- df2 %>% mutate(VALUE = if (exists('VALUE3', where=.)) VALUE   VALUE3 else VALUE)
df3 <- df2 %>% mutate(QANT = if (exists('QANT3', where=.)) QANT   QANT3 else QANT)
  

Это работает для каждого случая, но я бы сделал это со списком (l_data < c(«PROD», «VALUE», «QANT»)) в качестве параметра и без повторения одного и того же синтаксиса для каждой переменной?

спасибо

Ответ №1:

Я сделал это так, я думаю, есть несколько способов (применить, например)

 l_data <- c("PROD", "VALUE", "QANT")

for(item in l_data) {
  var3 <- paste0(item, "3")
  if (var3 %in% colnames(df2)) {
    df2 <- df2 %>% mutate(!!item := get(item)   get(var3))
  }
}
  

Комментарии:

1. Итак, я пытался сделать аналогичное использование mutate_if , используя %in% . Но по какой-то причине get(paste0(deparse(substitute(.x),'3'))) не работает. Сделайте post, если вы можете заставить его работать mutate_if .