0

我有这个数据框

|    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&的输出转换NoFault为分数我希望使用向量运算或plyr包来执行此操作,如果可以避免循环。

4

1 回答 1

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
于 2013-08-30T12:28:20.743 回答