2017-04-11 5 views
2

Das ist also einige Beispieldaten Ich habe: die neue Spalte wiederholt 1s bis signal3 ändert sich von 1 bisReplizieren von Werten nach einer bedingten Anweisung ist erfüllt?

signal1 signal2 signal3 
1   0   1   
1   1   1 
1   0   1 
1   0   1 
1   0   1 
1   0   1 
1   0   0 

Und ich will eine vierte Spalte hinzuzufügen, so dass, wenn signal1==signal2==signal3 beide 1 sind, 0.

So aus dem obigen Beispiel, ich möchte, wie etwas generieren:

signal1 signal2 signal3 signal_generate 
1   0   1   0 
1   1   1   1 
1   0   1   1 
1   0   1   1 
1   0   1   1 
1   0   1   1 
1   0   0   0 

ich das denke durch eine ifelse Aussage erreicht werden würde, aber ich habe viel Mühe über diese scheinbar einfache Aufgabe ist. Ich denke an etwas entlang der Linien zu tun:

signal_generate <- ifelse(data[,1]==data[,2]&data[,3]>0, rep(data[,3]==1), 0)

Aber ich kann nicht herausfinden, wie signal3 zu bekommen die richtige Anzahl der Male zu wiederholen.

Edit: Ich realisiere ein ifelse wäre albern, weil es nur Zeilen betrachten würde, in denen die Bedingung signal1 == signal2 == signal3 genau treffen. Ich bin immer noch furchtbar fest und Hilfe würde sehr geschätzt werden!

Antwort

1

Mit Hilfe von Replacing NAs with latest non-NA value

Ich bin nicht sicher, ob die Anfangsbedingungen korrekt gehandhabt werden.

df <- read.table(text=" 
signal1 signal2 signal3 
1   0   1   
1   1   1 
1   0   1 
1   0   1 
1   0   1 
1   0   1 
1   0   0 
", header=TRUE) 

library(zoo) 

# apply the logic using RowSums as a shortcut 
df$triple <- as.integer((rowSums(df[,1:3])) == 3L) 

# detect the change in signal and sett the initial condition 
df$signal_change <- ifelse(df$triple == 1L, 1L, ifelse(df$signal3 == 0L, 0, NA)) 
df$signal_change[1] <- df$triple[1] 

# generate the signal by carryign forward the changes 
df$signal_generate <- na.locf(df2$signal_change, na.rm=FALSE) 
df$signal_generate[1] <- df$signal_change[1] 

df 

# signal1 signal2 signal3 triple signal_change signal_generate 
# 1  1  0  1  0    0    0 
# 2  1  1  1  1    1    1 
# 3  1  0  1  0   NA    1 
# 4  1  0  1  0   NA    1 
# 5  1  0  1  0   NA    1 
# 6  1  0  1  0   NA    1 
# 7  1  0  0  0    0    0 
+0

Danke. Schnelle Frage: Funktioniert 'as.integer ((rowSums (df [, 1: 3])) == 3L') nur mit Tabellen oder kann dies mit' data.frame' verwendet werden? Ich habe versucht, dies auf meinen tatsächlichen Daten zu implementieren und es gab "0" für alles zurück. – Nikitau

+0

von der Hilfe für rowSums "... für numerische Arrays (oder Datenrahmen)". Ich habe kein Beispiel für Ihre Daten - am besten zu verwenden 'dput' und und hinzufügen das zur Frage Mein Beispiel ist ein Datenrahmen Ich schlage vor, Sie zu debuggen, indem Sie kleinstes Bit des Codes von innerstem zu äußersten ausführen und Ergebnisse überprüfen. Überprüfen Sie auch für Ihre Klammern – epi99

Verwandte Themen