r - 通过 sapply 应用多个函数

标签 r function apply gsub 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))

我想替换 Var1Var2 列中的一些文本值。下面的错误 语法说明了我要实现的目标:

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
})

自然地,代码在语法上不正确并且失败了。总而言之,我想执行以下操作:

  1. 遍历前两列(Var1 和 Var2) 中的所有值,并通过 gsub 执行简单的替换。
  2. 理想情况下,我想避免定义一个单独的函数,如 linked 中所讨论的那样在sapply 语法
  3. 中发布并保留所有内容
  4. 我不想要嵌套循环

我查看了讨论的大致相似的主题 herehere但是,如果可能的话,我想避免使用 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 语法中。

最佳答案

我们可以使用 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'))

关于r - 通过 sapply 应用多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479208/

相关文章:

如果任何值为非正数,则将行替换为 NA

r - 仅选择 data.frame R 中具有有限值的行

r - 图层中的子集参数不再适用于 ggplot2 >= 2.0.0

ios - 如何在 Swift 中的函数外部使用变量声明?

r - 自定义 ML 函数不起作用 : undefined columns selected

C++如何泛化类函数参数来处理多种类型的函数指针?

python - 我的 is_prime 函数在 9 上失败了,我不知道为什么?

python - 用 pandas 中训练数据的平均值填充测试数据中的 nan 值

r - 使用循环获取子字符串并将其存储在变量中

r - 如何根据它们对 R 中所有列的总和的贡献来删除数据框中的列