2016-12-05 4 views
0

Ich habe zwei Spalten ID und Trial. Die ID-Spalte ist mit NA s gefüllt. Die Spalte Trial beginnt bei 0 und endet mit einer arbritären Nummer (z. B. 1232), woraufhin die nächsten Testsequenzen mit 0 usw. beginnen. Mein Ziel ist es, eine eindeutige ID für jede Versuchsreihe zu erstellen.Wie kann ich eine data.table-Spalte durch eine Sequenz ersetzen, die von einer anderen Spalte abhängt?

Ich bin neu in R und erkennen, dass es mehrere Möglichkeiten, dieses Problem zu lösen:

  • Verwendung von zwei verschachtelten Schleifen
  • Mit lapply zusammen mit einem abstrakten Funktionsaufruf oder (oder rapply?) (?) Griff
  • mit nextElem vom iterator Paket zusammen mit Punkt 1 oder 2
  • zuerst die Liste zu erzeugen und den Ersatz die Werte in einem zweiten Schritt, zum Beispiel mit zwei seq() basierend auf irgendeiner Art von Iteration auf Untergruppen: ex_data[subset]

Bisher habe ich die Zahl der Teilnehmer heraus ist:

N <- dim(filter(ex_data, Trial == 0))[1] 

Oder elegante:

N <- count(ex_data[Trial == 0]) 

Insbesondere ist es der bedingte Teil, mit dem ich kämpfe und was die am meisten R-ähnliche Lösung wäre.

Pseudocode:

IDs are 1:N 

while IDs < N+1 
    current + 1 
    while column Trial is > 0 
     ID is IDs[current] 
     next Trial 
    next Trial 

Wie kann ich die Entscheidung, wenn Schleifen über wie die apply Familie kompakten Ausdrücke zu benutzen? Wie erzeuge ich eine neue Sequenz basierend auf einer fast zyklischen Spalte?

Example Data (for generation see below) 


     id t 
[1,] NA 0 
[2,] NA 1 
[3,] NA 2 
[4,] NA 3 
[5,] NA 4 
[6,] NA 5 
[7,] NA 0 
[8,] NA 1 
[9,] NA 2 
[10,] NA 3 
[11,] NA 4 
[12,] NA 5 
[13,] NA 6 
[14,] NA 7 
[15,] NA 0 
[16,] NA 1 
[17,] NA 2 
[18,] NA 3 
[19,] NA 4 
[20,] NA 5 
[21,] NA 6 
[22,] NA 7 
[23,] NA 8 
[24,] NA 9 
[25,] NA 10 
[26,] NA 11 
[27,] NA 12 


# Generate Example Data 
t <- c(0:5, 0:7, 0:12) 
id <- rep(NA, length(t)) 
dta <- cbind(id, t) 
# Optional (using dtplyr) 
# dta <- tbl_df(dta) 
+1

ein Beispieldaten hinzuzufügen, so dass eine neue Serie von '0' rechts angezeigt wird? –

+1

Bitte geben Sie ein kleines reproduzierbares Beispiel und die erwartete Ausgabe an – akrun

+1

'ex_data $ ID <- cumsum (ex_data $ Trial == 0)' würde funktionieren, außer Ihre Daten bedeuteten etwas anderes –

Antwort

0

Lösung:

ex_data$ID <- cumsum(ex_data$Trial==0) 
4

Wir data.table Methoden verwenden

ex_data[, ID := cumsum(!Trial)] 
+0

Dies ist eine * elegante *, sowohl die richtige 'data.table' Lösung als auch ein * hack *, der auf einer Wahrheitstabelle als' FALSE' in R operiert, ist gleichbedeutend mit 0. Allerdings verallgemeinert es nicht auf Versuche, die auf, sagen wir, 1. Es funktioniert auch für 'dtplyr' dt: s, aber nicht sicher, wie es funktioniert für df: s ... – noumenal

+1

@noumenal Ich bin mir nicht sicher, ob ich verstehe, wie Sie es wollten. Vielleicht 'dta%>% muate (id = cumsum (t == zuerst (t))) 'oder' ex_data [, ID: = cumsum (Versuch == Versuch [1L])] 'aus' data.table' – akrun

+0

Danke für Ihre Erfahrung.Ich mag Ihre Antwort, aber ich fürchte, Mr Wilson hat Sie dazu geschlagen. // Ich notiere die 'data.table'-Notation, das explizite' L'ong-Integer-Format und 'dplyr :: mutate'. – noumenal

Verwandte Themen