1

我已经掌握了一些非常混乱的数据,并且我编写了一个函数来进行一些转换(字符串到数字),我很想改进它。基本上,该函数采用杂乱字符数据的向量并将数据转换为数字。

例如:

##  say you had this
df1 <- data.frame ( V1 = c("   $25.25", "4,828", "      $7,253"), V2 = c( "THIS is bad data", "725", "*error"))

numconv <- function(vec){
    vec <- str_trim(vec)
    vec <- gsub(",|\\$", "", vec)
    if( sum(!grepl( "[0-9]",vec)) == 0){
        vec <- as.numeric(vec)
    }
    if( sum(!grepl( "[0-9]",vec)) != 0){
        print("!!ERROR STRANGE CHARACTERS!!")
    }
}

df1$V1recode <- numconv(df1$V1)
df1$V2recode <- numconv(df1$V2)
[1] "!!ERROR STRANGE CHARACTERS!!"

如何在函数中分配原始列名的名称,以便我可以将其粘贴到函数中的错误消息中,所以它改为:

!! V2 中的错误奇怪字符!

我尝试在函数中调用 names() 和 colnames() ,但这似乎不起作用。

在此先感谢, C

4

3 回答 3

2

deparse(substitute(.))把戏似乎奏效了。

numconv <- function(vec){nam <- deparse(substitute(vec))
    vec <- gsub(" ","", vec)
    vec <- gsub(",|\\$", "", vec)
    if( sum(!grepl( "[0-9]",vec)) == 0){
        vec <- as.numeric(vec)
    }
    if( sum(!grepl( "[0-9]",vec)) != 0){
        print(paste("!!ERROR STRANGE CHARACTERS!!", nam) )
    }
}
df1$V2recode <- numconv(df1$V2)
# [1] "!!ERROR STRANGE CHARACTERS!! df1$V2"

(我没有加载 stringr,因为我认为 gsub 调用会更有效。)

于 2013-05-10T23:01:04.003 回答
1

我觉得这是一种有点笨拙的方法,但是您可以使用substitue然后strsplit在 上$,但这假设您始终使用其名称来调用列$。无论如何,您可以使用它获取列名并将其粘贴到您希望的错误消息中......

    x <- strsplit(as.character( substitute(vec) ) ,"$" )[[3]]
于 2013-05-10T22:15:38.497 回答
1

关键是将重新编码也包装到函数中。这样您就可以跟踪您正在处理的列,从而获取列名以放入警告消息中。以下函数重新编码“col_names”参数中列出的数据框的任何列(如果留空,则该函数适用于所有列)。该函数返回原始数据帧,加上重新编码的列,其中flag添加了字符串 in 列名。

require(stringr)

df1 <- data.frame (
  V1 = c("   $25.25", "4,828", "      $7,253"), 
  V2 = c( "THIS is bad data", "725", "*error"))

numconv <- function(df, col_names = NULL, flag = "recode"){

  if(is.null(col_names)) {
    col_names <- colnames(df)
  }
    out <- lapply(1:length(col_names), function(i) {
      vec <- str_trim(df[,col_names[i]])
      vec <- gsub(",|\\$", "", vec)
      if( sum(!grepl( "[0-9]",vec)) == 0){
        vec <- as.numeric(vec)
      }
      if( sum(!grepl( "[0-9]",vec)) != 0){
        print(paste("!!ERROR STRANGE CHARACTERS in", col_names[i], "!!"))
      }
      vec
    })

    out <- data.frame(out, stringsAsFactors = FALSE)
    colnames(out) <- paste(col_names, flag, sep = "")
    cbind(df, out)
}

numconv(df1)
[1] "!!ERROR STRANGE CHARACTERS in V2 !!"
V1               V2 V1recode         V2recode
1       $25.25 THIS is bad data    25.25 THIS is bad data
2        4,828              725  4828.00              725
3       $7,253           *error  7253.00           *error
于 2013-05-10T22:56:45.280 回答