2016-11-02 3 views
1

IはEカウント及びR行列にデータを再編成

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 

、操作A、B、C、Dの結果を、以下のマトリックスを有します。

各操作のために良いと悪い結果をカウント
Name freok Frenok 
    A  3  4 
    B  5  6 
    C  7  0 
    D  0  8 
    E  8  9 

して、[OK]または操作のためのNOTOKは、第1の行列に欠落している場合は、私が処理行列にゼロを配置する必要があります。

私は最速の解決策は何行

の約16百万人の行列を処理する必要がありますか?

+0

サンプルデータにはカウントがありません。あなたの実際のデータに実際のカウントがある場合、 'tydir'の答えは失敗します。 –

答えて

4

我々は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 

からxtabsでこれを行うことができます迅速かつ効率的なオプションがRにtidyverseのtidyr(一部を使用して作業data.table

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

あなたのソリューションは、「スプレッド」機能を使用するよりも優れたパフォーマンスを発揮します。さらに数値が返されますが、スプレッドが文字を返す間にありがとう –

3

からdcastになり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 
+0

結果を転記しなければならない場合でも、SPREAD関数はA、B、C、D、Eをcoulmnsとokとnokとして返しました行として、微妙な詳細 –

+0

さらに残念なことに、結果はcolnames値とすべての文字列形式として結果を返します –

+0

私は理解しません。 'nok'と' ok'は数字である文字列ではありません。そして、dfを転置する必要はありません。私はより多くを示すために答えを明確にしましたが、それは期待どおりに動作します – cderv

関連する問題