Использование 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 "