2017-12-14 3 views
-1

Ich versuche, Variablen zum Zählen eines bestimmten Wertes in vorherigen Zeilen zu erstellen. Also für die count_a in der 3. Reihe muss ich die Anzahl von "a" in der ersten bis dritten Reihe zählen. Wie dies würde Ich mag count_a, count_b,count_c,cound_d,count_e erstellen (wenn eindeutige Werte von var1 ist c(a,b,c,d,e))Werte mit einer bestimmten Bedingung zählen

Daten:

var1  count_a  count_b  count_c ... 
    a   0   0   0 
    a   1   0   0 
    b   2   0   0 
    b   2   1   0 
    c   2   2   0 
    a   2   2   1 
    d   3   2   1 
    e   3   2   1 

Hier ist der Code für die Daten

Ich mag würde setDT(data) Funktion in data.table für diesen Einsatz Funktion.

+0

Ich habe var1 und hoffe, zweite dritte ... Spalte zu erstellen (Count_a, Count_b, ...) –

+0

Bitte akzeptieren Sie die Antwort, die geholfen hat, Ihr Problem zu lösen – PoGibas

Antwort

1

Als OP ausdrücklich bat um eine data.table Lösung hat, sind hier zwei leicht unterschiedliche Ansätze. Beachten Sie, dass diese alternativen Implementierungen von PoGibas' sapply() solution):

library(data.table) 
CJ(var1, unique(var1), sorted = FALSE)[ 
    , cnt := cumsum(shift(V1, fill = "") == V2), by = V2][ 
    , dcast(.SD, rowid(V2) ~ V2)][, V2 := var1][] 
V2 a b c d e 
1: a 0 0 0 0 0 
2: a 1 0 0 0 0 
3: b 2 0 0 0 0 
4: b 2 1 0 0 0 
5: c 2 2 0 0 0 
6: a 2 2 1 0 0 
7: d 3 2 1 0 0 
8: e 3 2 1 1 0 
CJ(unique(var1), var1, sorted = FALSE)[ 
    , cnt := cumsum(V1 == shift(V2, fill = "")), by = rleid(V1)][ 
    , dcast(.SD, rowid(V1) ~ V1)][, V1 := var1][] 


    V1 a b c d e 
1: a 0 0 0 0 0 
2: a 1 0 0 0 0 
3: b 2 0 0 0 0 
4: b 2 1 0 0 0 
5: c 2 2 0 0 0 
6: a 2 2 1 0 0 
7: d 3 2 1 0 0 
8: e 3 2 1 1 0 

Ich habe auch den Ansatz in this answer to another question of the OP verwendet anzuwenden versucht, aber es würde erfordern, von vielen Polieren des gewünschten erhalten Ergebnis hier:

DT <- data.table(var1) 
DT[, rn := .I][DT, on = .(rn < rn), by = .EACHI, .SD[, .(N = .N), by = var1]][ 
    , dcast(.SD, rn ~ var1, fill = 0)][DT, on = "rn"] 
rn a b c d NA var1 
1: 1 0 0 0 0 1 a 
2: 2 1 0 0 0 0 a 
3: 3 2 0 0 0 0 b 
4: 4 2 1 0 0 0 b 
5: 5 2 2 0 0 0 c 
6: 6 2 2 1 0 0 a 
7: 7 3 2 1 0 0 d 
8: 8 3 2 1 1 0 e 
0
count_a = cumsum(var1 == "a") 
count_a 
    [1] 1 2 2 2 2 3 3 3 

Dies erfüllt „ZÄHLWERT in 3. Reihe, ich brauche Anzahl der zu zählen‚a‘in der 1. ~ 3. Reihe“, aber das ist anders, was Sie in Ihrem Beispiel haben.

1

Lösung cumsum mit:

# OPs data 
foo <- c("a", "a", "b", "b", "c", "a", "d", "e") 

# Use cumsum to get cumulative sum 
# Using dummy variable to get first count as 0 
sapply(unique(foo), function(x) cumsum(c("dummy", foo) == x)) 
#  a b c d e 
# [1,] 0 0 0 0 0 
# [2,] 1 0 0 0 0 
# [3,] 2 0 0 0 0 
# [4,] 2 1 0 0 0 
# [5,] 2 2 0 0 0 
# [6,] 2 2 1 0 0 
# [7,] 3 2 1 0 0 
# [8,] 3 2 1 1 0 
# [9,] 3 2 1 1 1 

# Use data.table to join everything (as wanted by OP) 
library(data.table) 
result <- data.table(foo, 
        sapply(unique(foo), function(x) cumsum(c("dummy", foo) == x))) 
setnames(result, c("var1", paste0("count_", unique(foo)))) 
Verwandte Themen