我正在尝试复制在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语法
  • 之内
  • 我不要嵌套循环


  • 我看了讨论oj​​it_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/

    10-10 20:57