将绝对频率数据转换为原始数据

Convert absolute frequency data to raw data

我有来自 4 个电子分销商的绝对频率数据,表示他们为特定功率提供了多少电源 -class(以瓦特为单位)。我想将此数据转换为原始数据,以便为 4 个分销商创建箱线图和进行一些其他分析。 我已经尝试过 reshape2-lib 的 R 函数 melt(),但它将绝对频率视为测量值。

我的数据(绝对频率)是这样的:

power_in_watt digikey farnell mouser rs
1                   0       0      0  2
2                   0       0      0  1
4                   1       0      1  3
5                   2       0      0  3
6                   2       1      2  3
...

我想要的原始数据:

distributor power_in_watt
rs                      1
rs                      1
rs                      2
digikey                 4
mouser                  4
rs                      4
rs                      4
rs                      4
digikey                 5
digikey                 5
rs                      5
rs                      5
rs                      5
digikey                 6
digikey                 6
farnell                 6
mouser                  6
mouser                  6
rs                      6
rs                      6
rs                      6
rs                      6
...

有没有办法自动转换它(最好是在 R 中)?

我知道你想要的是根据给定的频率复制行。

首先,我们使用 tidyr 的长格式数据,reshape2 的后继库。

> library(tidyr)
> df.long <- df %>% gather(distributor, count, -power_in_watt)
> df.long
   power_in_watt distributor count
1              1     digikey     0
2              2     digikey     0
3              4     digikey     1
4              5     digikey     2
5              6     digikey     2
6              1     farnell     0
7              2     farnell     0
8              4     farnell     0
9              5     farnell     0
10             6     farnell     1
11             1      mouser     0

然后我们可以使用基数 R

根据计数扩展行
> df.long[rep(1:nrow(df.long)), df.long$count), ]
     power_in_watt distributor count
3                4     digikey     1
4                5     digikey     2
4.1              5     digikey     2
5                6     digikey     2
5.1              6     digikey     2
10               6     farnell     1
13               4      mouser     1
15               6      mouser     2
15.1             6      mouser     2
16               1          rs     2
16.1             1          rs     2
17               2          rs     1

编辑:仔细阅读让我完善我的答案

你可以试试单衬底 R:

stack(lapply(df[-1], rep, x=df[,1]))

#   values     ind
#1       4 digikey
#2       5 digikey
#3       5 digikey
#4       6 digikey
#5       6 digikey
#6       6 farnell
#7       4  mouser
#8       6  mouser
#9       6  mouser
#10      1      rs
#11      1      rs
#12      2      rs
#13      4      rs
#14      4      rs
#15      4      rs
#16      5      rs
#17      5      rs
#18      5      rs
#19      6      rs
#20      6      rs
#21      6      rs

数据:

df = structure(list(power_in_watt = c(1L, 2L, 4L, 5L, 6L), digikey = c(0L, 
0L, 1L, 2L, 2L), farnell = c(0L, 0L, 0L, 0L, 1L), mouser = c(0L, 
0L, 1L, 0L, 2L), rs = c(2L, 1L, 3L, 3L, 3L)), .Names = c("power_in_watt", 
"digikey", "farnell", "mouser", "rs"), class = "data.frame", row.names = c(NA, 
-5L))