2016-07-09 15 views
1

Ich habe eine Matrix, die Werte entweder gleich "J" oder "N" umfasst. Diese Werte erscheinen in einem Block von 3, 2 oder 1 und sind durch keine Werte getrennt. Ich würde gerne mal zählen, dass ein Block von 3,2 und 1 erscheint. Ich könnte es schaffen, wenn ich J und N durch 1 ersetze und dann entsprechend der nächsten Funktion zähle. Doch wie können Sie es zwischen J und N. Dankzählen die Anzahl der Vorkommen, wenn Zellen gleich Text sind

der Matrix zu trennen:

 t1 t2 t3 t4 t5 t6 t7 
[1,] 0 0 0 0 J J 0 
[2,] 0 0 N N 0 0 N 
[3,] J J J 0 0 0 0 
[4,] 0 0 N N N 0 0 

Der Code (von jemand im Chat) für J

n1 <- 2 
n2 <- 3 
res <- t(apply(Calendar, "J", FUN=function(x) { 
     x1 <- with(rle(x), lengths[!!values]) 
     c(sum(x1==n1), sum(x1==n2)) 
})) 
colnames(res) <- paste0("count", c(11, 111)) 
res 

Nun, es tut work.At das Ende nicht würde Ich mag eine Matrix haben (nach der anfänglichen Matrix)

J3 J2 J1 N3 N2 N1 
1 2 0 1 1 1 

bearbeiten und Anfrage Klarstellung: Unter der Annahme, dass dies ein Kalender und 1-7 sind Tage der Woche, was wäre die gewünschte Antwort auf diese potentielle Matrix sein:

Die Matrix:

 t1 t2 t3 t4 t5 t6 t7 
[1,] 0 0 0 0 0 J J 
[2,] J 0 N N 0 0 N 
[3,] J J J 0 0 0 N 
[4,] N 0 N N N 0 0 
+1

Wie hast du 2 für J2 und 0 für J1 bekommen? – akrun

Antwort

1

Wir verwenden rle

lst1 <- lapply(c("J", "N"), function(nm) t(apply(Calendar == nm, 1, 
      FUN = function(x) { 
      x1 <- with(rle(x), lengths[values]) 
      table(factor(x1, levels=1:3))}))) 
`row.names<-`(t(sapply(lst1, colSums)), c("J", "N")) 
+0

vielen Dank auch der, der mir beim letzten Mal geholfen hat. Ich habe eine andere Frage. Ich möchte eine Funktion aber Spalte für Spalte ausführen, aber es ist sehr wichtig, dass die Funktion zuerst auf die erste Spalte und dann auf die zweite angewendet wird. Ist die beste Lösung anwenden oder eine Schleife ist besser (da ich nicht meine Funktion auf jede Spalte bei Unzen anwenden möchte). Vielen Dank für Ihre Hilfe und einen schönen Tag. – richpiana

+0

@branchwarren Wenn die Ausgabe der ersten Spalten die zweite Spalte in jedem Lauf betrifft, ist es möglicherweise besser, eine For-Schleife zu verwenden. – akrun

Verwandte Themen