【发布时间】:2016-02-02 10:19:29
【问题描述】:
我正在尝试在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。我也有兴趣替换列值而不是创建新列,并且我想避免指定任何列名。在使用我现有的数据框时,使用列号对我来说更方便。
编辑
在非常有用的 cmets 之后,我想要实现的目标可以总结在下面的解决方案中:
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,感谢您的关注。假设我愿意进行 10 次替换和其他外观更改,例如应用
trimws。原则上,gsub对我来说已经足够了,但我希望能够将gsub命令的各种迭代应用到我决定通过sapply传递的列。 -
您遇到的主要问题是您没有分配任何内容,因此没有进行任何更改。
-
如果要替换多个条目,为什么不使用
mgsubfromlibrary(qdap) -
@Heroka 我知道,如前所述,代码是错误的,但它传达了我想要实现的目标。简而言之,我想将多个操作应用于没有 within
sapply的列列表。实际上,这是一个语法问题。我可以编写一个函数并将其传递给sapply,但我不想这样做。
标签: r function apply gsub sapply