3

我有以下数据框

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

我想添加2列,

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

以结束

> 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 回答