Я пытаюсь реплицировать решение при применении нескольких функций в sapply
, размещенном на R-Bloggers, но я не могу заставить его работать желаемым образом. Я работаю с простым набором данных, похожий на тот, генерироваться ниже:Применение нескольких функций через sapply
require(datasets)
crs_mat <- cor(mtcars)
# Triangle function
get_upper_tri <- function(cormat){
cormat[lower.tri(cormat)] <- NA
return(cormat)
}
require(reshape2)
crs_mat <- melt(get_upper_tri(crs_mat))
Я хотел бы заменить некоторые текстовые значения по столбцам Var1 и VAR2. ошибочными синтаксис ниже иллюстрирует то, что я пытаюсь достичь:
crs_mat[,1:2] <- sapply(crs_mat[,1:2], function(x) {
# Replace first phrase
gsub("mpg","MPG",x),
# Replace second phrase
gsub("gear", "GeArr",x)
# Ideally, perform other changes
})
Естественно, что код не является синтаксически правильным и не удается. Подводя итог, я хотел бы сделать следующее:
- Пройдите через все значения в первых двух столбцах (Var1 и var2) и выполнять простые замены через
gsub
. - В идеале я хотел бы избежать определения отдельной функции, как описано в linked пост и держать все в синтаксис
sapply
- Я не хочу, вложенный цикл
Я рассмотрел широко подобный предмет, обсуждаемый here и here, но, если возможно, я хотел бы избежать использования plyr
. Я также заинтересован в замене значений столбцов не на создание новых столбцов, и я хотел бы избежать указания имен столбцов. Во время работы с существующим фреймом данных мне удобнее использовать номера столбцов.
Редактировать
После очень полезные замечания, что я пытаюсь достичь можно резюмировать ниже решения:
fun.clean.columns <- function(x, str_width = 15) {
# Make character
x <- as.character(x)
# Replace various phrases
x <- gsub("perc85","something else", x)
x <- gsub("again", x)
x <- gsub("more","even more", x)
x <- gsub("abc","ohmg", x)
# Clean spaces
x <- trimws(x)
# Wrap strings
x <- str_wrap(x, width = str_width)
# Return object
return(x)
}
mean_data[,1:2] <- sapply(mean_data[,1:2], fun.clean.columns)
не нужна эта функция в моем global.env
, так что я могу работать rm
после этого, но даже более приятное решение будет включать в себя сжать это в рамках синтаксиса apply
.
Можете ли вы подробнее рассказать о других изменениях, которые вы хотите сделать? Сколько у вас есть замены? – Heroka
@Heroka, спасибо за проявление интереса. Предположим, что я готов сделать 10 замен и других косметических изменений, например, «trimws».В принципе, 'gsub' для меня достаточно, но я хочу иметь возможность применять различные итерации команд' gsub' к столбцам, которые я решаю передать через 'sapply'. – Konrad
Основная проблема, с которой вы столкнулись, заключается в том, что вы ничего не назначаете, поэтому никаких изменений не производится. – Heroka