#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
.