在没有循环的情况下对R数据帧执行选择性操作

时间:2013-08-30 12:05:18

标签: r plyr

我有这个数据框

|    A    |    B    |    C    | Output |
|---------|---------|---------|--------|
| NoFault | NoFault | NoFault |   8    |
|  Fault  | NoFault | NoFault |   2    |
| NoFault |  Fault  | NoFault |   0    |
|  Fault  |  Fault  | NoFault |   2    |
| NoFault | NoFault |  Fault  |   2    |
|  Fault  | NoFault |  Fault  |   0    |
| NoFault |  Fault  |  Fault  |   2    |
|  Fault  |  Fault  |  Fault  |   4    |

我使用以下代码生成了它:

A <- c(1,0,1,0,1,0,1,0)
B <- c(1,1,0,0,1,1,0,0)
C <- c(1,1,1,1,0,0,0,0)
Output <- c(8,2,0,2,2,0,2,4)
data <- data.frame(cbind(A,B,C,Output))

我希望执行一项操作来计算C列的输出百分比,结果应如下所示:

|    A    |    B    |    C    | Output |
|---------|---------|---------|--------|
| NoFault | NoFault | NoFault |8/(8+2) |
|  Fault  | NoFault | NoFault |2/(2+0) |
| NoFault |  Fault  | NoFault |0/(0+2) |
|  Fault  |  Fault  | NoFault |2/(2+4) |
| NoFault | NoFault |  Fault  |2/(2+8) |
|  Fault  | NoFault |  Fault  |0/(0+2) |
| NoFault |  Fault  |  Fault  |2/(2+0) |
|  Fault  |  Fault  |  Fault  |4/(4+2) |

所以,这里发生的事情是,无论何时我得到A列,B序列重复,我都会采用这些行并以百分比形式输出。

例如A = NoFaultB=NoFault,转换C Fault&amp;的输出NoFault成分 我希望使用向量运算或plyr包执行此操作,如果可以避免循环。

1 个答案:

答案 0 :(得分:1)

首先使用总数创建一个新列(或者一个临时变量,如果您愿意)。然后用它来获得百分比。

data$Total <- ave(Output, A, B, FUN=sum)
data$Percent <- data$Output/data$Total
data

##   A B C Output Total   Percent
## 1 1 1 1      8    10 0.8000000
## 2 0 1 1      2     2 1.0000000
## 3 1 0 1      0     2 0.0000000
## 4 0 0 1      2     6 0.3333333
## 5 1 1 0      2    10 0.2000000
## 6 0 1 0      0     2 0.0000000
## 7 1 0 0      2     2 1.0000000
## 8 0 0 0      4     6 0.6666667