2016-12-13 2 views
1

Eine Datentabelle Statusbericht für Projekte, die von Lebensjahr zeigt:links von einer Reihe spezifischer Spaltenindexwertes in der gleichen Zeile

def <- data.frame(c("ProjA", "ProjB", "ProjC"), c("0", "2", "2"), 
       c("Active", "Cancelled", "Distressed"), c("Active", NA, "Distressed"), 
       c("Active", "Cancelled", "Distressed"), c("Active", NA, "Distressed"), stringsAsFactors = FALSE) 
colnames(def) <- c("proj.name", "status.update.year", "year.0", "year.1", "year.2", "year.3") 
def$status.update.year <- as.numeric(def$status.update.year) 

def 

    proj.name status.update.year  year.0  year.1  year.2  year.3 
1  ProjA     0  Active  Active  Active  Active 
2  ProjB     2 Cancelled  <NA> Cancelled  <NA> 
3  ProjC     2 Distressed Distressed Distressed Distressed 

status.update.year variable Datensätze Jahr der Veränderung von "Active" in einen anderen Status.

Projekte sollten beginnen "Active", aber ein Projekt, das "Distressed" in Jahr 3 wurde, wird jetzt in allen vergangenen Jahren "Distressed" berichtet, für die es eine Beobachtung gibt. Diese fehlerhafte Rückdatierung will ich korrigieren.

Ich möchte die Zeilenwerte für die mit "0" bis "3" beschrifteten Spalten so ändern, dass vor dem Jahr der Statusaktualisierung alle Nicht-NA-Beobachtungen vor dem Jahr der Statusänderung mit "Aktiv" markiert werden führen wie folgt aus:

proj.name status.update.year  year.0  year.1  year.2  year.3 
1  ProjA     0  Active  Active  Active  Active 
2  ProjB     2  Active  <NA> Cancelled  <NA> 
3  ProjC     2  Active  Active Distressed Distressed 

ich alle nicht-NA Beobachtungen für jede Zeile vor der letzte nicht-NA Beobachtung finden:

apply(def[ ,3:6], 1, function(x) { head(x[!is.na(x)], -1) }) 

Wie diese Werte ersetzen mit "Active", wenn sie vor jeder Reihe spezifische status.update.year sind?

+0

Also, wenn ich das richtig verstehe, Sie alle Fälle konvertieren möchten, wo das Jahr <= 'status.update .year zu 'Active' außer wo es eine NA gibt? –

+0

Ja genau richtig. – user983465

Antwort

1

Try this:

library(data.table) 
def = data.table(def) 

for (y in 0:3) { 
    v = paste0('year.',y) 
    def[!is.na(get(v)) & y < status.update.year, (v):= 'Active'] 
} 
+0

gearbeitet. Vielen Dank! – user983465

0

Hier ist eine weitere Option mit set von data.table

library(data.table) 
setDT(def) 
for(j in 0:3) { 
    j1 <- grep(j, names(def)) 
    set(def, i = which(!is.na(def[[j1]]) & j < def$status.update.year), 
            j = j1, value = "Active") 
} 
Verwandte Themen