1

特定のデータ フレームについて、配列の値をデータ フレームの列に乗算したいと考えています。データ フレームは、名前、数値、および 2 つの係数値を含む行で構成されます。

name credit gender group
n1 10 m A
n2 20 f B
n3 30 m A
n4 40 m B
n5 50 f C

このデータ フレームは、次のコマンドを使用して生成できます。

name    <- c('n1','n2','n3','n4','n5')
credit  <- c(10,20,30,40,50)
gender  <- c('m','f','m','m','f')
group   <- c('A','B','A','B','C')
DF      <-data.frame(cbind(name,credit,gender,group))
# binds columns together and uses it as a data frame

さらに、データ フレームから派生した行列があります (より複雑なケースでは、これは配列になります)。この行列には、特定のカテゴリ (m/f および A/B/C で特徴付けられる) に分類されるすべての契約の合計値が含まれます。

   m f
A 40 NA
B 40 20
C NA 50

目標は、マトリックスの各カテゴリに割り当てられた対応する値を使用して DF$credit の値を乗算することです。たとえば、DF の最初の行の値 10 は 40 (m と A によって定義されるカテゴリ) で乗算されます。

結果は次のようになります。

name credit gender group result
n1 10 m A 400
n2 20 f B 400
n3 30 m A 1200
n4 40 m B 1600
n5 50 f C 2500

可能であれば、R ベース パッケージを使用してこれを実行したいと考えていますが、適切に機能する有用なソリューションについてはオープンです。

4

3 に答える 3

3

derivedからインデックス行列を作成することにより、(派生行列である)にインデックスのセットを構築できます。が存在する理由は、とが要因であるのに対し、私は文字インデックスが必要なためです。DF$groupDF$genderas.characterDF$groupDF$gender

>idx = matrix( c(as.character(DF$group),as.character(DF$gender)),ncol=2)
>idx
[,1] [,2]
[1,] "A"  "m" 
[2,] "B"  "f" 
[3,] "A"  "m" 
[4,] "B"  "m" 
[5,] "C"  "f" 
>DF$result = DF$credit * derived[idx]

最後の行で、上記のコードを使用して生成するDFと、数値列が因子として表示されることに注意してください(つまりDF$credit、因子です)。その場合、あなたはする必要がありますas.numeric(DF$credit)*derived[idx]。ただし、実際のデータでは、データフレームにはDF$credit要素としてではなく、数値として含まれていると思います。

于 2011-12-21T00:13:31.367 に答える
2

data.frameオブジェクトを作成するときは、cbindを使用しないでください。これは不要であり、クレジット変数が強制的に要素になります。

使用するだけDF <- data.frame(name, credit, gender, group)

次に、data.frameオブジェクトの各行を通過するforループを実行します。

n <- length(DF$credit)
result <- rep(0, n)
for(i in 1:n) {
  result[i] <- DF$credit[i] * sum(DF$credit[DF$gender==DF$gender[i] & DF$group==DF$group[i]])
}

data.frameオブジェクトを、結果を含むこの新しいオブジェクトに置き換えます。

DF <- data.frame(name, credit, gender, group, result)
于 2011-12-21T00:15:05.003 に答える
2

パッケージをお勧めしますが、base関数plyrを使用してこれを行うことができます。by

> by(DF, DF['name'], function (row) row$credit * m[as.character(row$group), as.character(row$gender)])
name: n1
[1] 400
--------------------------------------------------------------------- 
name: n2
[1] 400
--------------------------------------------------------------------- 
name: n3
[1] 1200
--------------------------------------------------------------------- 
name: n4
[1] 1600
--------------------------------------------------------------------- 
name: n5
[1] 2500

plyr素敵なデータフレームとして結果を得ることができます:

> ddply(DF, .(name), function (row) row$credit * m[as.character(row$group), as.character(row$gender)])
  name   V1
1   n1  400
2   n2  400
3   n3 1200
4   n4 1600
5   n5 2500
于 2011-12-21T00:16:58.877 に答える