2016-11-02 4 views
1

I가 동작 (A)의 결과 다음과 같은 행렬, I는 다음과 같은 형식을 갖는 새로운 테이블을 생성 할 필요가 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 

: 좋고 나쁜 결과를 각각 카운트 동작 및 조작의 확인 또는 notok는 제 1 행렬에없는 경우, 그때의 처리 매트릭스에 0을 넣어야

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

.

나는 행

가장 빠른 해결책은 무엇

의 약 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 함수가 coulmns, ok, nok로 A, B, C, D, E를 돌려주었습니다. 행으로 그냥 사소한 세부 –

+0

또한 불행히도 그것은 결과를 colnames 값과 모두 문자열 형식으로 반환합니다 –

+0

나는 이해가 안돼. 'nok'와'ok'는 숫자가 아닌 문자열입니다. 그리고 df를 조 변경 할 필요가 없습니다. 나는 더 많은 것을 보여주기 위해 대답을 분명히했지만 예상대로 작동한다. – cderv