2017-05-03 5 views
0

Ich versuche, für jede Zeile, um die Ergebnisspalte Wert durch den nächsten entsprechenden Rückgabewert zu ersetzen/zu aktualisieren, wenn die Tagesspalte Wert gleich 1 ist. Also zum Beispiel:Abrufen/ersetzen Spalte Wert aus nachfolgenden Zeilen mit bestimmten Kriterien

* reproduzierbares Beispiel:

set.seed(123) 
df<-data.frame(return=sample(runif(10, min = 0, max = 1)),day=seq(5, 1, by=-1), result =0) 
df 

* erwartete Ausgabe:

index  return value result 
1 0.4566147  5  0.2875775 
2 0.9404673  4  0.2875775 
3 0.0455565  3  0.2875775 
4 0.5514350  2  0.2875775 
5 0.2875775  1  0.2875775 
6 0.5281055  5  0.7883051 
7 0.8924190  4  0.7883051 
8 0.8830174  3  0.7883051 
9 0.4089769  2  0.7883051 
10 0.7883051  1  0.7883051 

Ihre Hilfe wird sehr geschätzt.

Antwort

0

Zum Beispiel mit dplyr:

library(dplyr) 
df %>% 
    mutate(group = cumsum(lag(day, default = 0) == 1)) %>% 
    group_by(group) %>% 
    mutate(result = return[day == 1]) %>% 
    ungroup() 

# # A tibble: 10 × 4 
#  return day result group 
#  <dbl> <dbl>  <dbl> <int> 
# 1 0.4566147  5 0.2875775  0 
# 2 0.9404673  4 0.2875775  0 
# 3 0.0455565  3 0.2875775  0 
# 4 0.5514350  2 0.2875775  0 
# 5 0.2875775  1 0.2875775  0 
# 6 0.5281055  5 0.7883051  1 
# 7 0.8924190  4 0.7883051  1 
# 8 0.8830174  3 0.7883051  1 
# 9 0.4089769  2 0.7883051  1 
# 10 0.7883051  1 0.7883051  1 
0

Lösung mit data.frame:

df$result <- df[df$day == 1, "return"][cumsum(lag(df$day, default = 0) == 1) + 1] 
df 
     return day result 
1 0.4566147 5 0.2875775 
2 0.9404673 4 0.2875775 
3 0.0455565 3 0.2875775 
4 0.5514350 2 0.2875775 
5 0.2875775 1 0.2875775 
6 0.5281055 5 0.7883051 
7 0.8924190 4 0.7883051 
8 0.8830174 3 0.7883051 
9 0.4089769 2 0.7883051 
10 0.7883051 1 0.7883051 
0

einer Datentabelle Ansatz,

library(data.table) 

setDT(df)[, result := return[day == 1], by = (grp =cumsum(c(1, diff(day != 1) == 1)))][] 

#  return day result 
# 1: 0.4566147 5 0.2875775 
# 2: 0.9404673 4 0.2875775 
# 3: 0.0455565 3 0.2875775 
# 4: 0.5514350 2 0.2875775 
# 5: 0.2875775 1 0.2875775 
# 6: 0.5281055 5 0.7883051 
# 7: 0.8924190 4 0.7883051 
# 8: 0.8830174 3 0.7883051 
# 9: 0.4089769 2 0.7883051 
#10: 0.7883051 1 0.7883051 
Verwandte Themen