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

时间:2016-11-02 10:09:11

标签: r matrix counting

我有以下矩阵,操作结果为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

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

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

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

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

什么是最快的解决方案?

2 个答案:

答案 0 :(得分:4)

我们可以使用xtabs

中的base R执行此操作
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)

答案 1 :(得分:3)

使用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