2016-11-02 5 views
1

У меня следующая матрица, с результатами операций А, В, С, D, ЕПодсчет и реорганизации данных в 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 

мне нужно создать новую таблицу, имеющую следующий формат:

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

подсчета для каждой операции хорошие и плохие результаты, и если нормально или ноток для операции отсутствует в первой матрице, то мне нужно поставить ноль в обработанном матрице.

мне нужно обработать матрицу около 16 миллионов строк

Что самое быстрое решение?

+0

В ваших данных примера нет счета. Если в ваших реальных данных есть фактический подсчет, тогда ответ 'tydir' не будет –

ответ

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) 
+0

Ваше решение имеет лучшую производительность, чем использование функции« распространения ». кроме того, он возвращает числовые значения, в то время как спред возвращал символы, спасибо большое –

3

Использование tidyr (часть tidyverse в R и работает с 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