0

私はRを初めて使用し、データを異なるデータフレームで正規化する関数を作成しようとしています。

正規化プロセスは非常に簡単です。正規化したい数値を各オブジェクトの人口サイズ (テーブル人口に格納されている) で割るだけです。どのオブジェクトが互いに関連しているかを知るために、最初の列の各データフレームに格納されている ID を使用しようとしました。

人口データフレームにある一部のオブジェクトには、正規化するデータフレームに対応するオブジェクトがないため、そうすることにしました。つまり、データフレームにはオブジェクトが少ない場合があります。

通常はリレーショナル データベースを構築しますが (私も試しました)、うまくいきませんでした。そのため、関数内でオブジェクトを関連付けようとしましたが、関数は機能しませんでした。たぶん、あなたの誰かがこれを経験していて、私を助けることができます.

したがって、この関数を作成しようとしたのは次のとおりです。

    # Load Tables
    # Agriculture, Annual Crops
    table.annual.crops <-read.table ("C:\\Users\\etc", header=T,sep=";")
    # Agriculture, Bianual and Perrenial Crops
    table.bianual.crops <-read.table ("C:\\Users\\etc", header=T,sep=";")
    # Fishery
    table.fishery <-read.table ("C:\\Users\\etc", header=T,sep=";")
    # Population per Municipality
    table.population <-read.table ("C:\\Users\\etc", header=T,sep=";")

    # attach data
    attach(table.annual.crops)
    attach(table.bianual.crops)
    attach(table.fishery)
    attach(table.population)


    # Create a function to normalize data
    # Objects should be related by their ID in the first column
    # Values to be normalized and the population appear in the second column
    funktion.norm.percapita<-function (x,y){if(x[,1]==y[,1]){x[,2]/y[,2]}else{return("0")}}

    # execute the function
    funktion.norm.percapita(table.annual.crops,table.population)
4

1 に答える 1

5

アタッチ手順から始めましょう...なぜですか?それは通常不必要であり、あなたを困らせる可能性があります! 特に、人口 data.frame と作物 data.frame の両方にジオコードが列として含まれているためです。

コメントで提案されているように、使用できますmerge。これにより、デフォルトで、同じ名前の列を使用して data.frames が結合されます。パラメータを使用して結合する列を指定できますby

dat <- merge(table.annual.crops, table.population)
dat$crop.norm <- dat$CropValue / dat$Population

あなたの機能が機能していない理由は?あなたの声明の結果を見てくださいif

table.annual.crops[,1] == table.population[,1]

短いベクトルをリサイクルするブール値のベクトルを指定します。データが非常に大きい (数百万行程度) 場合、merge関数は遅くなる可能性があります。その場合は、data.tableパッケージを見て、代わりにそのマージ機能を使用してください。

于 2012-11-13T15:50:30.253 に答える