通过 sapply 应用多个函数
Applying multiple function via sapply
我正在尝试在 sapply
posted 和 R-Bloggers 中复制应用多个函数的解决方案,但我无法使其以所需的方式工作。我正在处理一个简单的数据集,类似于下面生成的数据集:
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 列中的一些文本值。下面的 erroneous 语法说明了我要实现的目标:
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 post 中所讨论的那样,并将所有内容 保持在
sapply
语法
- 我不想要嵌套循环
我查看了讨论的大致相似的主题 here and 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
之后,但更好的解决方案将涉及 squeezing 这在 apply
语法中。
这是一个适合您的解决方案的开始,我认为您有能力自己扩展它。可能有更优雅的方法可用,但我没有看到它们。
crs_mat[,1:2] <- sapply(crs_mat[,1:2], function(x) {
# Replace first phrase
step1 <- gsub("mpg","MPG",x)
# Replace second phrase. Note that this operates on a modified dataframe.
step2 <- gsub("gear", "GeArr",step1)
# Ideally, perform other changes
return(step2)
#or one nested line, not practical if more needs to be done
#return(gsub("gear", "GeArr",gsub("mpg","MPG",x)))
})
我们可以使用 library(qdap)
中的 mgsub
来替换多个模式。在这里,我使用 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'))
我正在尝试在 sapply
posted 和 R-Bloggers 中复制应用多个函数的解决方案,但我无法使其以所需的方式工作。我正在处理一个简单的数据集,类似于下面生成的数据集:
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 列中的一些文本值。下面的 erroneous 语法说明了我要实现的目标:
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 post 中所讨论的那样,并将所有内容 保持在
sapply
语法 - 我不想要嵌套循环
我查看了讨论的大致相似的主题 here and 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
之后,但更好的解决方案将涉及 squeezing 这在 apply
语法中。
这是一个适合您的解决方案的开始,我认为您有能力自己扩展它。可能有更优雅的方法可用,但我没有看到它们。
crs_mat[,1:2] <- sapply(crs_mat[,1:2], function(x) {
# Replace first phrase
step1 <- gsub("mpg","MPG",x)
# Replace second phrase. Note that this operates on a modified dataframe.
step2 <- gsub("gear", "GeArr",step1)
# Ideally, perform other changes
return(step2)
#or one nested line, not practical if more needs to be done
#return(gsub("gear", "GeArr",gsub("mpg","MPG",x)))
})
我们可以使用 library(qdap)
中的 mgsub
来替换多个模式。在这里,我使用 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'))