将值的出现开始提取到最后一次出现?

时间:2017-04-06 06:00:08

标签: r

我正在尝试将第一列的第一次出现与最后一次出现进行比较。我正在尝试检查col2中重复值结束时col1发生了多少变化。例如,对于样本数据:

Date           col1     col2
2016-12-20       1        5    <= first occurrence of 1    
2017-01-12       1        7    <= last occurrence of 1 (compare 7 > 5, passes: conclude 1)
2017-01-13      -1        8    <= first occurrence of -1      
2017-01-16      -1        10          
2017-01-17      -1        11   <= last occurrence of -1 (compare 11 < 8, fails: conclude 0)      

如果col1为1且last occurrence > first occurrence,那么我想返回1.如果col1为-1且last occurrence < first occurrence,则我想返回-1

2016-12-20       1        5     0    
2017-01-12       1        7     1    
2017-01-13      -1        8     0    
2017-01-16      -1        10    0     
2017-01-17      -1        11    0 

在上述情况下,我不确定如何提取值的第一次和最后一次出现。非常感谢帮助!

2 个答案:

答案 0 :(得分:0)

df视为您的输入:

df =  read.table(text='Date           col1     col2
2016-12-20       1        5   
2017-01-12       1        7   
2017-01-13      -1        8   
2017-01-16      -1        10          
2017-01-17      -1        11
             ', stringsAsFactors=FALSE, header=TRUE)

您可以尝试按col1进行分组,按日期排列,然后简单地比较col2的极值:

df %>% 
  group_by(col1) %>%
  arrange(Date) %>%
  filter(row_number()==1 | row_number()==n()) %>%
  mutate( k = (col2 - lag(col2,1)) * col1) %>%
  mutate( k = if_else((k/abs(k)) <0, 0, k)) %>%
  select(col1, k) %>%
  filter(!is.na(k))

给出:

Source: local data frame [2 x 2]
Groups: col1 [2]

   col1     k
  <int> <dbl>
1     1     1
2    -1     0

P.S。必须对输出k进行规范化以匹配您所需的格式。

答案 1 :(得分:0)

使用data.table

library(data.table) dt<-setDT(df) dt[,col4:=ifelse((seq_len(.N)==.N),ifelse((.SD[.N,2]*col1>.SD[1,2]*col1),1,0),0),by=(col1)]