我正在尝试复制在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
})
自然,该代码在语法上是不正确的,并且会失败。总结一下,我想做以下事情:
gsub
执行简单替换。 sapply
语法我看了讨论ojit_a和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
语法中。 最佳答案
我们可以使用mgsub
中的library(qdap)
替换多个模式。在这里,我使用lapply
循环第一和第二列,并将结果分配回crs_mat[,1:2]
。请注意,我使用的是lapply
而不是sapply
,因为lapply
使结构保持完整
library(qdap)
crs_mat[,1:2] <- lapply(crs_mat[,1:2], mgsub,
pattern=c('mpg', 'gear'), replacement=c('MPG', 'GeArr'))
关于r - 通过sapply应用多功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33479208/