我有这个数据框
| 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 = NoFault
,B=NoFault
,转换C Fault
&amp;的输出NoFault
成分
我希望使用向量运算或plyr
包执行此操作,如果可以避免循环。
答案 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