У меня есть фрейм данных (d3), который имеет некоторые имена столбцов с «Date_Month.Year», я хочу заменить имена этих столбцов просто «Month.Year», поэтому, если есть несколько столбцов с одним и тем же «Month.Year»они будут просто суммированным столбцом.
Ниже приведен код, который я пробовал, и вывод
library(stringr)
print(colnames(d3))
#below is output of the print statement
#[1] "ProductCategoryDesc" "RegionDesc" "SourceDesc" "variable"
#[5] "2019-02-28_Feb.2019" "2019-03-01_Mar.2019" "2019-03-04_Mar.2019" "2019-03-05_Mar.2019"
#[9] "2019-03-06_Mar.2019" "2019-03-07_Mar.2019" "2019-03-08_Mar.2019"
d3 <- d3 %>% mutate(col = str_remove(col, '*._'))
Вот ошибка, которую я получаю: Ошибка оценки: аргумент str
должен быть символомvector (или объект, который можно преобразовать в).
Таким образом, я получил ответ на первую часть своей проблемы. Я использовал для получения всех имен столбцов в формате Month.Year, но теперь у меня возникают проблемы с суммированием столбцов, имеющихто же имя, для этого я посмотрел на Sum и заменил столбцы с одинаковым именем R для фрейма данных, содержащего разные классы
colnames(d3) <- gsub('.*_', '', colnames(d3))
Ниже приведен код, который я использовал для суммирования столбцов, чтоиметь повторяющееся имя, однако с этим кодом необязательно помещать суммированные значения в правильные столбцы.
indx <- sapply(d3, is.numeric)#check which columns are numeric
nm1 <- which(indx)#get the numeric index of the column
indx2 <- duplicated(names(nm1))|duplicated(names(nm1),fromLast=TRUE)
nm2 <- nm1[indx2]
indx3 <- duplicated(names(nm2))
d3[nm2[!indx3]] <- Map(function(x,y) rowSums(x[y],na.rm = FALSE),
list(d3),split(nm2, names(nm2)))
d3 <- d3[ -nm2[indx3]]