计算和重组 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
我有以下矩阵,其中包含操作 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