Использование gsub в R для множественных изменений

У меня есть data.frame, где я хочу "очистить" имена столбцов:

>names(Data)
[1] "tBodyAcc.mean...X" 
[2] "angle.X.gravityMean."
[3] "fBodyBodyGyroJerkMag.mean.."
[4] "fBodyAccMag.meanFreq.."
             .
             .

Я использую следующий код:

names(Data)<-gsub('[mM]ean',' Mean ',names(Data))
names(Data)<-gsub('[Ff]req',' Frequency ',names(Data))
names(Data)<-gsub('^t','Time  ',names(Data))
names(Data)<-gsub('\\.',' ',names(Data))

чтобы получить следующее:

[1] "Time  BodyAcc  Mean    X"       
[2] "angle X gravity Mean  "         
[3] "fBodyBodyGyroJerkMag  Mean   "  
[4] "fBodyAccMag  Mean  Frequency   "

Есть ли способ навязать это тем или иным способом более элегантно, чем этот?

3 ответа

Решение

Вы также можете попробовать stri_replace_all_regex от stringi пакет:

library(stringi)
stri_replace_all_regex(names(Data), c("mean", "freq", "^t", "\\."), c(' Mean ', ' Frequency ', 'Time  ', ' '), F, list(case_insensitive = TRUE))
# [1] "Time  BodyAcc  Mean    X"        "angle X gravity Mean  "         
# [3] "fBodyBodyGyroJerkMag  Mean   "   "fBodyAccMag  Mean  Frequency   "

То, что у вас есть, уже довольно хорошо, но первые два регулярных выражения можно немного упростить, используя ignore.case = TRUE, Кроме того, поскольку, кроме последнего, мы хотим заменить только одно вхождение, было бы лучше использовать sub вместо gsub:

nms <- c("tBodyAcc.mean...X", "angle.X.gravityMean.", 
            "fBodyBodyGyroJerkMag.mean..", "fBodyAccMag.meanFreq..")

nms <- sub('mean', ' Mean ', nms, ignore.case = TRUE)
nms <- sub('freq', ' Frequency ', nms, ignore.case = TRUE)
nms <- sub('^t', 'Time  ', nms)
nms <- gsub('\\.', ' ', nms)

Поскольку вам необходимо применять каждое регулярное выражение к полному вектору, нет способа сделать это без какого-либо цикла. В приведенном ниже примере n твой names(Data) вектор:

n <- c("tBodyAcc.mean...X", "angle.X.gravityMean.", "fBodyBodyGyroJerkMag.mean..", "fBodyAccMag.meanFreq..")
for(i in seq_along(n)) {
  p <- c('[mM]ean', '[Ff]req', '^t', '\\.')
  r <- c(' Mean ', ' Frequency ', 'Time  ', ' ')
  n <- gsub(p[i], r[i], n)
}

Результат:

> n
[1] "Time  BodyAcc  Mean    X"        "angle X gravity Mean  "         
[3] "fBodyBodyGyroJerkMag  Mean   "   "fBodyAccMag  Mean  Frequency   "
Другие вопросы по тегам