これを行う方法は、あなたが提案したように、「ポリゴンのポイントアプローチ」を使用することです。つまり、これを視覚的に行う場合、それはまさに頭の中で行っていることです。受け入れられた答えの問題は、この場合(および単純な場合)、決定木を構築できる可能性がある一方で、より多くのカテゴリーがある状況では、このプロセスが非常に複雑なIMHOになることです。おそらくカテゴリは重複しています。おそらくカテゴリは単一のポイントにすぎません。ここで提案するプロセスでは、これらのアーティファクトは結果に影響を与えません。
ggternパッケージで提供されるデータセットに基づいて、USDA土壌分類図の作成、以下に添付する結果については、すでにここで説明しました。

しかし、それほど明確ではないかもしれませんが、ggternパッケージには、これを必要以上に面倒にする機能がいくつかあるということです。具体的には、ggternパッケージ(バックエンドで日常的に使用される)には、参照カテゴリに対して各ポイントのポリゴン真理値表のポイントを評価するために必要な変換を行うための内部関数がいくつかあります。
このようなアプローチは、 plyrパッケージのddply関数、およびspパッケージのpoint.in.polygon関数を使用するとかなり簡単です。
まず、必要なパッケージをロードし、ggternからUSDAデータをロードします。また、いくつかのサンプルデータを作成し、頂点にある点と分類領域の中心にある点についてこのプロセスをテストしてみましょう。
library(ggtern)
library(sp)
library(plyr)
#The Main Data to lookup against
data(USDA)
#The sample Data (Try a point at a vertice, and a point in the middle...)
testData = rbind(data.frame(Clay=.4,Sand=.2,Silt=.4), #Vertice point
data.frame(Clay=1,Sand=1,Silt=1)/3) #Simple middle point
次に、内部関数、を使用して、transform_tern_to_cart(...)
両方のデータセットをデカルト座標に変換することをお勧めします。
#Do the transformation to cartesian
USDA[,c("x","y")] = transform_tern_to_cart(USDA$Clay,USDA$Sand,USDA$Silt)
testData[,c("x","y")] = transform_tern_to_cart(testData$Clay,testData$Sand,testData$Silt)
ddply(...)
との組み合わせをapply(...)
使用することにより、関数を使用して、参照セットの各カテゴリに対して、テストセットの各ポイントをテストできpoint.in.polygon(...)
ます。
#Create a function to do the lookup
lookup <- function(data=testData,lookupdata=USDA,groupedby="Label"){
if(!groupedby %in% colnames(lookupdata))
stop("Groupedby value is not a column of the lookupdata")
#For each row in the data
outer = apply(data[,c("x","y")],1,function(row){
#for each groupedby in the lookupdata
inner = ddply(lookupdata,groupedby,function(df){
if(point.in.polygon(row[1],row[2],df$x,df$y) > 0) #Is in polygon?
return(df) #Return a valid dataframe
else
return(NULL) #Return nothing
})
#Extract the groupedby data from the table
inner = unique(inner[,which(colnames(inner) == groupedby)])
#Join together in csv string and return to 'outer'
return(paste(as.character(inner),collapse=","))
})
#Combine with the original data and return
return(cbind(data,Lookups=outer))
}
これは、次の方法で呼び出すことができます。
#Execute
lookup()
予想どおり、最初のポイントは4つのカテゴリを満たし、2番目のポイントは1つだけを満たしていることに気付くでしょう。