基于另外两个值标准化矢量

时间:2012-11-18 20:37:15

标签: r plyr

我有以下数据框

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

我想添加2列

  • 添加'r1',Value与同一级别的Type A Value的比率
  • 添加'r2',Value与同一类型的Level 1 Value的比率

最终以

结束
> 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中的某些内容。

2 个答案:

答案 0 :(得分:2)

由于您提出了plyr解决方案:

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

我认为很好。

答案 1 :(得分: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)