2016-05-21 5 views
3

Haben Sie einen Datenrahmen wie dieseTidyr wie in Zählung des Auftretens zu verbreiten

other=data.frame(name=c("a","b","a","c","d"),result=c("Y","N","Y","Y","N")) 

Wie kann ich Bildfunktion in tidyr oder eine andere Funktion verwenden, um die Zahl der Treffer Y oder N als Spaltenüberschrift wie dieses

zu bekommen
name  Y N 
a   2 0 
b   0 1 

Dank

+2

suchen 'Tabelle (andere)'? – mtoto

Antwort

11

Dies sind ein paar Möglichkeiten, wie viele, darüber zu gehen:

1) Mit Bibliothek dplyr, können Sie einfach Gruppe Dinge und zählen in das Format benötigt:

library(dplyr) 
other %>% group_by(name) %>% summarise(N = sum(result == 'N'), Y = sum(result == 'Y')) 
Source: local data frame [4 x 3] 

    name  N  Y 
    <fctr> <int> <int> 
1  a  0  2 
2  b  1  0 
3  c  0  1 
4  d  1  0 

2) Sie können eine Kombination aus table und tidyr Verbreitung verwenden können wie folgt:

library(tidyr) 
spread(as.data.frame(table(other)), result, Freq) 
    name N Y 
1 a 0 2 
2 b 1 0 
3 c 0 1 
4 d 1 0 

3) Sie können Sie eine Kombination aus dplyr und tidyr tun wie folgt:

library(dplyr) 
library(tidyr) 
spread(count(other, name, result), result, n, fill = 0) 
Source: local data frame [4 x 3] 
Groups: name [4] 

    name  N  Y 
    <fctr> <dbl> <dbl> 
1  a  0  2 
2  b  1  0 
3  c  0  1 
4  d  1  0 
5

Hier ist ein weiteres Opt Ion mit dcast von data.table

library(data.table) 
dcast(setDT(other), name~result, length) 
# name N Y 
#1: a 0 2 
#2: b 1 0 
#3: c 0 1 
#4: d 1 0 

Obwohl table(other) eine kompakte Option (von @ mtoto Kommentare) sein würde, für große Datensätze, es effizienter sein kann dcast zu verwenden. Einige Benchmarks sind unten angegeben

set.seed(24) 
other1 <- data.frame(name = sample(letters, 1e6, replace=TRUE), 
    result = sample(c("Y", "N"), 1e6, replace=TRUE), stringsAsFactors=FALSE) 

other2 <- copy(other1) 

gopala1 <- function() other1 %>% 
          group_by(name) %>% 
          summarise(N = sum(result == 'N'), Y = sum(result == 'Y')) 
gopala2 <- function() spread(as.data.frame(table(other1)), result, Freq) 
gopala3 <- function() spread(count(other1, name, result), result, n, fill = 0) 
akrun <- function() dcast(as.data.table(other2), name~result, length) 


library(microbenchmark) 
microbenchmark(gopala1(), gopala2(), gopala3(), 
        akrun(), unit='relative', times = 20L) 
#  expr  min  lq  mean median  uq  max neval 
# gopala1() 2.710561 2.331915 2.142183 2.325167 2.134399 1.513725 20 
# gopala2() 2.859464 2.564126 2.531130 2.683804 2.720833 1.982760 20 
# gopala3() 2.345062 2.076400 1.953136 2.027599 1.882079 1.947759 20 
# akrun() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 20 
Verwandte Themen