3

私は次のデータフレームを持っています

df <- data.frame(
  Type=rep(LETTERS[1:6],3),
  Level=rep(1:3,each=6),
  Value=1:18)

2列追加したいのですが

  • 同じレベルのタイプA値に対する値の比率である「r1」を追加します
  • 同じタイプのレベル1値に対する値の比率である「r2」を追加します

で終わる

> df
   Type Level Value       r1   r2
1     A     1     1 1.000000  1.0
2     B     1     2 2.000000  1.0
3     C     1     3 3.000000  1.0
4     D     1     4 4.000000  1.0
5     E     1     5 5.000000  1.0
6     F     1     6 6.000000  1.0
7     A     2     7 1.000000  7.0
8     B     2     8 1.142857  4.0
9     C     2     9 1.285714  3.0
10    D     2    10 1.428571  2.5
11    E     2    11 1.571429  2.2
12    F     2    12 1.714286  2.0
13    A     3    13 1.000000 13.0
14    B     3    14 1.076923  7.0
15    C     3    15 1.153846  5.0
16    D     3    16 1.230769  4.0
17    E     3    17 1.307692  3.4
18    F     3    18 1.384615  3.0

applyいくつかのタイプのアプローチを試しましたが、うまくいきませんでした。for私は二重ループになってしまいました:

for(i in unique(df$Type)) {
  for(j in unique(df$Level)) {
    df$r1[df$Level==j & df$Type==i] <- df$Value[df$Level==j & df$Type==i]/df$Value[df$Level==j & df$Type=="A"]
    df$r2[df$Level==j & df$Type==i] <- df$Value[df$Level==j & df$Type==i]/df$Value[df$Level==1 & df$Type==i]
  }
}

これはそれほど悪くはありませんが、おそらくに何かを入れて、それを行う分割-適用-結合アプローチがあるかどうか疑問に思っていますplyr

4

2 に答える 2

2

あなたが解決策を提案したのでplyr

df <- ddply(df, .(Level), transform, r1 = Value / Value[Type == "A"])
df <- ddply(df, .(Type),  transform, r2 = Value / Value[Level == 1])

よく読めると思います。

于 2012-11-19T02:41:15.853 に答える
1

最初にベクトルを作成してから、それらをデータフレームに結合します。

 r1 <- df$Value / df$Value[rep(df$Value[df$Type=='A'], each=length(levels(df$Type)))]
 r2 <- df$Value / df$Value[seq_along(levels(df$Type))]

これは、例のように、「タイプ」が「レベル」ごとに繰り返されることを前提としています。

適切なcbind()呼び出しは次のとおりです。

cbind(df, r1, r2)
于 2012-11-18T21:12:17.490 に答える