2

flodelの助けを借りて、数値コードをルックアップ テーブルの値ラベルに置き換える方法を見つけました。

私は野心的ですが、今それを機能に入れたいと思っています。また、データに急降下する必要がある参照テーブルがたくさんあるので、関数が便利です。

しかし、最初にいくつかのサンプル データを、データ フレームから始めて、

df <- data.frame(id = c(1:6),
                 profession = c(1, 5, 4, NA, 0, 5))

df
#  id profession
#  1          1
#  2          5
#  3          4
#  4         NA
#  5          0
#  6          5

職業コードに関する人間が読み取れる情報を含むルックアップ テーブル、

profession.lookuptable <- c(Optometrists=1, Accountants=2, Veterinarians=3, 
                            `Financial analysts`=4,  Nurses=5)

flodelは、数値コードをルックアップ テーブルの値ラベルに置き換える方法を教えてくれました。このような、

match.idx <- match(df$profession, profession.lookuptable)
df$profession <- ifelse(is.na(match.idx), 
                 df$profession, names(profession.lookuptable)[match.idx])

df
#  id         profession
#  1        Optometrists
#  2              Nurses
#  3  Financial analysts
#  4                <NA>
#  5                   0
#  6              Nurses

これを関数に入れ、データ フレームdfと変数の名前を記述professionし、関数に残りを処理させたいと考えています。

私は自分の関数を次のように定義します。

ADDlookup <- function(orginalDF, orginalVAR) {
   DF.VAR <- paste(orginalDF, "$", orginalVAR, sep="")
   lookup.table <- paste(orginalVAR, ".lookuptable")
   match.idx <- match(DF.VAR, lookup.table)
   DF.VAR <- ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
}

しかし、明らかにそれは機能していません

ADDlookup(df, profession)

エラーが発生します

Error in paste(orginalDF, "$", orginalVAR, sep = "") : 
  object 'profession' not found

さて、ここで行き詰まります。

どのマニュアルページを読む必要があるか、またはこれを解決するためのフレンドリーなヒントを教えてください。

読んでくれてありがとう。

4

3 に答える 3

4

関数に渡しprofessionているためですがADDlookup、まだ存在していません。

関数の記述方法では、変数の名前を含む文字ベクトルを使用するか、変数自体を使用するかを区別する必要があります。

たとえば、最初の数行paste(originalDF,'$',originalVAR,sep='')などは文字列を期待originalDForiginalVARて文字列であるように見え、文字になります。ただし、そうすると、変数になりたいように見えます。DF.VAR 'df$profession'matchDF.VAR df$profession

これは私があなたがそれを回避することを提案する方法です:-originalDFオブジェクトとして渡す、存在する-文字列としてdf 渡す、存在する(それは列名であり、したがって文字列です)originalVAR'profession'

次に、以下を介してデータフレームからに含まれる列を取得します。originalVar

DF.VAR <- originalDF[,originalVAR] # e.g. df[,'profession']

これで、オブジェクトを探す次の行はprofession.lookuptable少しトリッキーになります。文字列 を作成してから、その名前のオブジェクト'profession.lookuptable'を検索します。

getこれには、 ( )を使用できます?get。データフレームget('df')を返します:df

lookup.table <- get(paste(orginalVAR, "lookuptable",sep='.'))

これにより、というオブジェクトが取得されます'profession.lookuptable'。直接入力した場合と同じルールに従うprofession.lookuptableため、関数がそのオブジェクトを「認識」できることを確認する必要があります(この場合は問題ありません)。

次に、列がルックアップ値に置き換えられたoriginalDFデータフレームを返したいようです。originalVAR

originalDF[,originalVAR]列をルックアップ値に置き換えて変更します。

originalDF[,originalVAR] <- 
   ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])

;への引数として渡したデータフレームを実際に変更していないことに注意してください。Rは、関数内でデータフレームのコピーを作成します。したがって、オリジナルは保持されます。dfADDlookupdf

最後に、データフレームを返す必要があります。

return(originalDF)

すべて一緒に今:

ADDlookup <- function(orginalDF, orginalVAR) {
   # retrieve the originalVAR column of originalDF
   DF.VAR <- originalDF[,originalVAR] 
   # find the variable called {originalVAR}.lookuptable
   lookup.table <- get(paste(originalVAR, "lookuptable",sep='.'))
   # look up the values
   match.idx <- match(DF.VAR, lookup.table)
   # replace the originalVAR column with the looked-up values
   originalDF[,originalVAR] <- 
       ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
   # return the modified data frame
   return(originalDF)
}

そして今それをテストするために:

> ADDlookup(df,'profession')
  id         profession
1  1       Optometrists
2  2             Nurses
3  3 Financial analysts
4  4               <NA>
5  5                  0
6  6             Nurses

オリジナルdfは変更されていないことに注意してください。一般に、R関数はそれらに渡されるパラメーターを変更しません。


別の改善点として、関数professions.lookupを呼び出す前に作成されたテーブルに依存することは一般的に少し危険です。ADDlookup

シバン全体lookup.table <- get( 'profession.lookup' )(さまざまなスコープに複数の'profession.lookup'テーブルがあるかどうかによって異なります)の代わりに、ルックアップテーブルをパラメーターとして渡すことを強くお勧めします。

ADDlookup <- function( originalDF, originalVAR, lookup.table )

get(xxxx)そうすれば、その行全体(およびそれに伴うすべての関連するスコーピングの問題)を回避できます。

次に、次の方法で関数を呼び出します。

ADDlookup( df, 'profession', profession.lookup )
于 2012-04-04T04:45:26.050 に答える
3

これを最初に想定した方法で機能させるには、確かにもっと複雑な方法がありますが、この関数がどのように機能するかを簡単に再編成する方がはるかに簡単です。

ADDLookup <- function(originalDF,var,varLookup){
    match.idx <- match(originalDF[,var], varLookup)
    originalDF[,var] <- ifelse(is.na(match.idx), 
                        originalDF[,var], names(varLookup)[match.idx])
    originalDF
}                            

ADDLookup(df,"profession",profession.lookuptable)
  id         profession
1  1       Optometrists
2  2             Nurses
3  3 Financial analysts
4  4               <NA>
5  5                  0
6  6             Nurses

dfここで、問題の変数の名前であるデータフレームをvarリテラル文字として渡し、ルックアップテーブル自体を引数として渡していることに注意してください。

$また、プログラミングよりもインタラクティブな使用で使用される理由を学びました。関数に渡された引数とうまくかみ合わないからです。そのタイプのタスクには、[構文が必要です。

于 2012-04-04T04:45:13.973 に答える
0

ルックアップ テーブルを因子として定義します。

df[,"profession"] <- profession.lookuptable[df[,"profession"]]
于 2012-04-04T10:42:43.657 に答える