2

重複の可能性:
R の要因によるデータ フレームのフィルタリング

変数をテーブルに対してマップし、対応する列に値を返す簡単な関数を作成しました。考え方は、Excel の vlookup とほとんど同じです。私が書いた関数は次のとおりです。

ApplyMap <- function(mappingtable,variable){
  if(ncol(mappingtable)!=2){
    "Mapping table needs to have two columns"
  }else{
    names(mappingtable) <- c("col1","col2")
    output <- mappingtable[col1==variable]$col2[1]
    output <- as.character(if(is.na(output)){variable}else{output})
    return(output)
  }
}

私の地図:

require(data.table)

mapping <- structure(list(Field1 = structure(c(4L, 1L, 2L, 3L), .Label = c("Amsterdam", 
"Arnhem", "Groningen", "Rotterdam"), class = "factor"), Field2 = structure(c(4L, 
3L, 1L, 2L), .Label = c("Gelderland", "Groningen", "Noord-Holland", 
"Zuid-Holland"), class = "factor")), .Names = c("Field1", "Field2"
), row.names = c(NA, -4L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x7f93f1018578>)

これを次のような単純な変数に適用すると:

ApplyMap(mapping,"Arnhem")
[1] "Gelderland"

また

ApplyMap(mapping,"New York")
[1] "New York"

うまく機能しているようです。ただし、次の data.table に適用し、必要に応じてマップの 2 番目の列に別の列を追加したいと思います。リストは次のとおりです。

list <- structure(list(List = structure(c(6L, 1L, 2L, 3L, 4L, 5L, 7L), .Label = c("Amsterdam", 
"Arnhem", "Groningen", "Haarlem", "Maastricht", "Rotterdam", 
"Utrecht"), class = "factor")), .Names = "List", class = "data.frame", row.names = c(NA, 
-7L))

私は次のコードでこれをやろうとします:

list$Province <- ApplyMap(mapping,list$List)

残念ながら、これは適切に機能していないようです。正しく動作しない理由を理解するのを手伝ってくれる人はいますか? 上記の行を実行すると、次のエラー メッセージが表示されます。

Error in Ops.factor(col1, variable) : level sets of factors are different

明らかに、マッピング テーブルの 2 番目の列の値を使用して、テーブルの 2 番目の列を取得したいと考えています。

4

0 に答える 0