计算和重组 R 矩阵中的数据

Counting and reorganizing data in a R matrix

我有以下矩阵,其中包含操作 A、B、C、D、E 的结果

  Name  result  freq
  A     ok      3
  A     nok     4
  B     ok      5
  B     nok     6
  C     ok      7
  D     nok     8
  E     ok      8
  E     nok     9

我需要创建一个具有以下格式的新 table:

  Name  freok   Frenok
  A       3      4
  B       5      6
  C       7      0
  D       0      8
  E       8      9 

计算每个操作的好坏结果,如果第一个矩阵中缺少操作的 ok 或 notok,那么我需要在处理后的矩阵中放一个零。

我需要处理一个大约有 1600 万行的矩阵

最快的解决方案是什么?

我们可以用 base R

中的 xtabs 来做到这一点
xtabs(freq~Name+result, df1)
#   result
#Name nok ok
#   A   4  3
#   B   6  5
#   C   0  7
#   D   8  0
#   E   9  8

一个快速有效的选择是 dcast 来自 data.table

library(data.table)
dcast(as.data.table(df1), Name~ paste0("fre", result), value.var="freq", sum)

使用 tidyr(R 中 tidyverse 的一部分并使用 dplyr

# your data example
df <- structure(
  list(
    Name = c("A", "A", "B", "B", "C", "D", "E", "E"),
    result = c("ok", "nok", "ok", "nok", "ok", "nok", "ok", "nok"),
    freq = c(3L, 4L, 5L, 6L, 7L, 8L, 8L, 9L)
  ),
  class = "data.frame",
  row.names = c(NA,-8L),
  .Names = c("Name", "result", "freq")
)

df
#>   Name result freq
#> 1    A     ok    3
#> 2    A    nok    4
#> 3    B     ok    5
#> 4    B    nok    6
#> 5    C     ok    7
#> 6    D    nok    8
#> 7    E     ok    8
#> 8    E    nok    9

res <- df %>% tidyr::spread(result, freq, fill = 0)

res
#>   Name nok ok
#> 1    A   4  3
#> 2    B   6  5
#> 3    C   0  7
#> 4    D   8  0
#> 5    E   9  8
str(res)
#> 'data.frame':    5 obs. of  3 variables:
#>  $ Name: chr  "A" "B" "C" "D" ...
#>  $ nok : num  4 6 0 8 9
#>  $ ok  : num  3 5 7 0 8