ए के लिए यह इस तरह दिखेगा।

Name    Date       Value     NewColumn   other columns
A       2000-01      0.5      
A       2001-03      0.4      0
A       2002-02      1.0      1  
A       2003-05      0.9      0
A       2004-06      0.9
A       2006-03      0.4        <- no previous year
0
bli12blu12 1 जून 2018, 19:26

2 जवाब

सबसे बढ़िया उत्तर
df = read.table(text = "
Name      Date       Value
A       2000-01      0.5
A       2001-03      0.4 
A       2002-02      1.0
A       2003-05      0.9
A       2004-06      0.9
A       2006-03      0.4 
", header=T, stringsAsFactors=F)

library(dplyr)

df %>%
  group_by(Name) %>%                                # for each name
  mutate(change = Value/lag(Value)-1,               # get the change in value (increase or decrease)
         year = as.numeric(substr(Date, 1, 4)),     # get the year from the date
         NewColumn = case_when(change > 0.01 & lag(year) == year-1 ~ 1,         # if change is more than 1% and the previous row is 1 year before flag as 1
                               change < -0.01 & lag(year) == year-1 ~ 0)) %>%   # if change is less than 1% and the previous row is 1 year before flag as 0
  ungroup()

# # A tibble: 6 x 6
#   Name  Date    Value  change  year NewColumn
#   <chr> <chr>   <dbl>   <dbl> <dbl>     <dbl>
# 1 A     2000-01   0.5  NA      2000        NA
# 2 A     2001-03   0.4  -0.200  2001         0
# 3 A     2002-02   1     1.5    2002         1
# 4 A     2003-05   0.9  -0.100  2003         0
# 5 A     2004-06   0.9   0      2004        NA
# 6 A     2006-03   0.4  -0.556  2006        NA

आप कुछ अनावश्यक चर हटा सकते हैं। प्रक्रिया कैसे काम करती है, यह समझने में आपकी मदद करने के लिए मैंने उन्हें छोड़ दिया।

1
AntoniosK 1 जून 2018, 20:35

जैसा कि प्रश्न को data.table के साथ टैग किया गया है, यहां एक समान समाधान है जो NA और तार्किक मानों के साथ कुछ मुश्किल अंकगणित का उपयोग करता है:

library(data.table)
setDT(DT)[order(Date), NewColumn := {
  yr <- year(lubridate::ymd(Date, truncated = 1L))
  chg <- Value / shift(Value) - 1.0
  NA^(yr - shift(yr) != 1L) * NA^(!abs(chg) > 0.01) * (sign(chg) / 2.0 + 0.5)
}, by = Name][]
   Name    Date Value NewColumn
1:    A 2000-01   0.5        NA
2:    A 2001-03   0.4         0
3:    A 2002-02   1.0         1
4:    A 2003-05   0.9         0
5:    A 2004-06   0.9        NA
6:    A 2006-03   0.4        NA

यहां चाल इस तथ्य का उपयोग करने के लिए है कि NA^0 1 है और NA^1 NA है, और वह FALSE 0 और TRUE से 1 से मेल खाता है, ताकि

NA^c(FALSE, TRUE)

रिटर्न

[1]  1 NA

आंकड़े

library(data.table)
DT <- fread("Name      Date       Value
A       2000-01      0.5
A       2001-03      0.4 
A       2002-02      1.0
A       2003-05      0.9
A       2004-06      0.9
A       2006-03      0.4 ")
1
Gregor Thomas 1 जून 2018, 20:28