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"

(gsub 呼び出しの方が効率的だと思ったので、stringr はロードしませんでした。)

于 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」引数にリストされているデータ フレームの列を再コード化します (null のままにすると、関数はそれらすべてに適用されます)。この関数は、元のデータ フレームに加えflagて、列名に文字列が追加された再コード化された列を返します。

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 に答える