Заменить имена столбцов на строку справа от "_" - PullRequest
0 голосов
/ 20 марта 2019

У меня есть фрейм данных (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]]

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Если вы хотите изменить имена столбцов, вы должны изменить colnames:

colnames(d3) <- gsub('.*_', '', colnames(d3))

Обратите внимание, в вашем регулярном выражении кванторы (т.е. *) идут после того, что они количественно определяют. Так должно быть .*_, а не *._

Пример, в котором мы удаляем текст перед . в iris:

colnames(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

# In regex, . means any character, so to match an actual '.',
#   we need to 'escape' it with \\.
colnames(iris) <- gsub('.*\\.', '', colnames(iris))

colnames(iris)
[1] "Length"  "Width"   "Length"  "Width"   "Species"
0 голосов
/ 20 марта 2019
colnames(d3) <- sapply(colnames(d3), function(colname){
    return( str_remove(colname, '.*_') )
})

Регулярное выражение должно быть ". * _", Чтобы соответствовать регистру, который вам нужен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...