Разница между текущим и предыдущим годом зависит от ключевого столбца - PullRequest
0 голосов
/ 11 июня 2018

Я получил следующее df:

Name   Year  [Columns which should stay like that]  V2  C2   KeyC
A      2001       ...                               4   7    NA
A      2002       ...                               2   0.5   1
A      2003       ...                               4   0.2   0
A      2005       ...                               3   0.3   NA
B      2004       ...                               0   0.4   NA
B      2006       ...                               1   7     NA
B      2007       ...                               2   0.6   1
C      2002       ....                              4     4    NA

Итак, идея заключается в следующем.У меня есть столбец KeyC, который содержит ненулевое значение, если наблюдение из моего столбца Имя имеет в предыдущей строке предыдущего года.Например: Для A: строка 2 содержит 2002 год. Проверьте, есть ли предыдущий год в строке 1. Да, так как строка 1 содержит 2001 год.

Что я хочу сделать сейчас, так это то, что я хочупостроить различие от наблюдений из столбцов V2 и C2, используя значение текущего года минус значение предыдущего года, деленное на значение предыдущего года.Затем я хочу поместить это расчетное значение в ту же строку текущего года.Итак, в основном, где в моем keycolum есть не-значение.

Есть ли способ сделать это?:)

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 11 июня 2018
dat%>%
   group_by(Name)%>%
   mutate(i=c(0,diff(Year))==1,
         V2= ifelse(i,(V2-lag(V2))/lag(V2),V2),
         C2= ifelse(i,(C2-lag(C2))/lag(C2),C2),
         i=NULL)
# A tibble: 8 x 6
# Groups:   Name [3]
  Name   Year X.Columns.which.should.stay.like.that.     V2     C2  KeyC
  <fct> <int> <fct>                                   <dbl>  <dbl> <int>
1 A      2001 ...                                     4.00   7.00     NA
2 A      2002 ...                                    -0.500 -0.929     1
3 A      2003 ...                                     1.00  -0.600     0
4 A      2005 ...                                     3.00   0.300    NA
5 B      2004 ...                                     0.     0.400    NA
6 B      2006 ...                                     1.00   7.00     NA
7 B      2007 ...                                     1.00  -0.914     1
8 C      2002 ....                                    4.00   4.00     NA
0 голосов
/ 11 июня 2018
df <- data.table::fread(
  "Name   Year    V2  C2   KeyC
  A      2001                                      4   7    NA
  A      2002                                      2   0.5   1
  A      2003                                      4   0.2   0
  A      2005                                      3   0.3   NA
  B      2004                                      0   0.4   NA
  B      2006                                      1   7     NA
  B      2007                                      2   0.6   1
  C      2002                                      4     4    NA"
)

library(dplyr)

df %>% 
  mutate_at(vars(V2, C2),
            ~ if_else(is.na(df$KeyC), as.double(.x),(.x - lag(.x)) / lag(.x)))

  Name Year   V2         C2 KeyC
1    A 2001  4.0  7.0000000   NA
2    A 2002 -0.5 -0.9285714    1
3    A 2003  1.0 -0.6000000    0
4    A 2005  3.0  0.3000000   NA
5    B 2004  0.0  0.4000000   NA
6    B 2006  1.0  7.0000000   NA
7    B 2007  1.0 -0.9142857    1
8    C 2002  4.0  4.0000000   NA

Вы можете добавить дополнительные переменные к предложению vars(), если вам нравится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...