2016-04-27 20 views
2

Ich habe zum Beispiel einen Vektor mit 1000 Obs und 3 Ebenen (A, B, C). Ich möchte zählen, wie oft Level A für alle 5 Zeilen auftritt und einen anderen Vektor der Zählwerte erzeugt, dh mit 200obs. Kann jemand helfen? Ich habe herausgefunden, wie man basierend auf einer anderen Variablen zählt, aber nicht auf der Anzahl der Zeilen. Vielen Dank!R Zählen, wie oft ein Level in n Zeilen auftritt

df <- data.frame(test=factor(sample(c("A","B", "C"),1000,replace=TRUE))) 
head(df, 10) 
    test 
1  A 
2  A 
3  B 
4  C 
5  B 
6  A 
7  C 
8  B 
9  C 
10 C 
+3

Vielleicht 'lapply (split (df $ test, rep (1: 200, jeweils = 5)), Tabelle)'? –

+0

Mögliches Duplikat von [R - Wie zählt man wie viele Werte pro Level in einem bestimmten Faktor?] (Http://stackoverflow.com/questions/26114525/r-how-to-count-how-many-values-per- level-in-a-given-factor) –

Antwort

4

Hier verwenden ein paar Optionen sind Ihnen nützlich sein könnten:

a) zählen alle Einträge pro 5 Zeilen und eine Liste zurück:

head(lapply(split(df$test, rep(1:200, each = 5)), table), 2) 
# $`1`  # <- result for rows 1:5 
# 
# A B C 
# 1 0 4 
# 
# $`2`  # <- result for rows 6:10 
# 
# A B C 
# 3 0 2 

b) alle Einträge pro 5 Zeilen zählen und eine Matrix zurückgeben:

head(t(sapply(split(df$test, rep(1:200, each = 5)), table)), 2) 
# A B C 
# 1 1 0 4 
# 2 3 0 2 

c) gezählte Anzahl von A s pro 5 Reihen und gibt eine Liste:

head(lapply(split(df$test == "A", rep(1:200, each = 5)), sum), 2) 
# $`1` 
# [1] 1 
# 
# $`2` 
# [1] 3 

d) gezählte Anzahl von A s pro 5 Reihen und zurück einen Vektor:

head(sapply(split(df$test == "A", rep(1:200, each = 5)), sum), 2) 
#1 2 
#1 3 

Jedes der Ergebnisse wird 200 Einträge lang sein/200 Zeilen haben.

+0

Statt 'rep (1: 200, each = 5)' könnte man auch etwas wie '((seq_len (nrow (df)) -1)% /% 5) + verwenden 1' –

+1

Eine Alternative zu 'Split'ting könnte' table sein (rep (seq_len (nrow (df)/5), jede = 5), df $ test) ' –

+0

@alexis_laz, ziemlich cool - das wusste ich nicht war möglich. –

1

Wir data.table

library(data.table) 
setDT(df)[, .N , .(grp= gl(nrow(df), 5, nrow(df)), test)] 
2

Hier ist eine Lösung mit dplyr und tidyr

library(dplyr) 
library(tidyr) 
df %>% 
    mutate(Set = (seq_along(test) - 1) %/% 5) %>% 
    group_by(Set, test) %>% 
    summarise(N = n()) %>% 
    spread(key = test, value = N, fill = 0) 
0

Wenn Sie dplyr bevorzugen, könnten Sie

c1 <- df %>% 
    mutate(group = rep(paste0("G", seq(1, 200)), each = 5)) %>% 
    # count each level 
    count(group, test) 

Hinweis verwenden, dass diese Methode nicht enthalten Ebenen ohne Werte für eine bestimmte Gruppe (also keine 0 Werte)

Verwandte Themen