R表示下一年的上个月年份值

时间:2018-11-23 11:36:25

标签: r database dataframe

我有这样的每月数据,我的第一列是date,下一个列是me

我需要做简单的事情: 我需要创建另一个变量,以使整个1994年的价值为me在1993年12月的价值。同样,1995年的价值为1994年12月,依此类推。如果不可用,请给NA。

structure(list(date = structure(c(8673, 8702, 8734, 8765, 8796, 
8824, 8855, 8884, 8916, 8946, 8975, 9008, 9038, 9069, 9099, 9129, 
9161, 9189, 9220, 9248, 9281, 9311, 9342, 9373, 9402, 9434, 9464, 
9493, 9526, 9555, 9584, 9616, 9647, 9675, 9708, 9738, 9769, 9800, 
9829, 9861, 9892, 9920, 9951, 9981, 10011, 10042, 10073, 10102, 
10134, 10165, 10193, 10226, 10256, 10284, 10316, 10346, 10375, 
10407, 10438, 10469, 10499, 10529, 10560, 10591, 10620, 10648, 
10681, 10711, 10739, 10772, 10802, 10834, 10864, 10893, 10925, 
10956, 10987, 11016, 11047, 11075, 11108, 11138, 11169, 11200, 
11229, 11261, 11291, 11320), class = "Date"), me = c(41535, 39458.25, 
38766, 43611.75, 54687.75, 65763.75, 66456, 92069.25, 89300.25, 
82452.125, 81066.375, 76909.125, 70698.75, 79709.375, 77630, 
71391.875, 69312.5, 69312.5, 70542.8125, 52621.125, 46520.125, 
43469.625, 45757.5, 43850.9375, 40492, 32088, 38964, 35149.75, 
32857.375, 35149.75, 29074.75, 26779.375, 27544.5, 32140.5, 32905.75, 
32905.75, 34436.25, 31375.25, 32140.5, 29878.875, 39838.5, 42519.9375, 
42707.25, 40014, 43861.5, 51615.125, 46992.875, 46992.875, 53996.25, 
47053.875, 47053.875, 46706, 50180, 56356, 65641.25, 69116.375, 
65255.125, 60469.5, 62020, 41863.5, 48919.5, 55908, 57461, 57970.3125, 
59137.5, 53301.5625, 68475, 72365.625, 65751.5625, 71587.5, 85982.8125, 
73921.875, 84496.5, 82149.375, 79019.875, 89973.125, 99752.8125, 
106794.1875, 103425.5625, 123669, 143544.375, 143325, 139668.75, 
143325, 139536, 122820.75, 125001, 101933.0625)), .Names = c("date", 
"me"), class = "data.frame", row.names = c(81L, 80L, 79L, 82L, 
87L, 91L, 92L, 88L, 83L, 90L, 94L, 86L, 84L, 93L, 89L, 85L, 102L, 
101L, 95L, 105L, 96L, 106L, 99L, 100L, 104L, 98L, 97L, 103L, 
108L, 107L, 112L, 111L, 109L, 110L, 114L, 117L, 115L, 116L, 118L, 
113L, 123L, 125L, 130L, 128L, 119L, 122L, 127L, 120L, 126L, 129L, 
121L, 124L, 140L, 136L, 139L, 137L, 134L, 132L, 131L, 141L, 133L, 
135L, 138L, 142L, 146L, 153L, 154L, 150L, 148L, 144L, 149L, 152L, 
143L, 145L, 151L, 147L, 165L, 157L, 156L, 163L, 164L, 160L, 161L, 
158L, 155L, 166L, 162L, 159L))

5 个答案:

答案 0 :(得分:1)

library(lubridate)
new$date <- ymd(new$date)

new$flag <- ifelse(month(new$date) == month(12),1,"NA")

这是使用Base R ad lubridate的简单解决方案

答案 1 :(得分:1)

这是一个可能的解决方案:

library(zoo)
library(lubridate)

我们首先创建一些简单有用的变量:

d <- d %>% 
  mutate(date = ymd(date),
         month = month(date),
         year = year(date)) %>% 
  groupby(year) %>% # for each year we fill just the december value in new_var
  mutate(new_var = ifelse(month==12, me, NA)) %>% ungroup()

现在,我们可以使用new_var中的na.locf来填充zoo。向前移动每个NA时,将填充最后一个非空值(十二月的值)。

d <- d %>% 
  mutate(new_var = na.locf(new_var, na.rm=F)) 

head(d, 10)
# # A tibble: 10 x 5
# date           me month  year new_var
# <date>      <dbl> <dbl> <dbl>   <dbl>
# 1 1993-09-30 41535      9  1993     NA 
# 2 1993-10-29 39458.    10  1993     NA 
# 3 1993-11-30 38766     11  1993     NA 
# 4 1993-12-31 43612.    12  1993  43612.
# 5 1994-01-31 54688.     1  1994  43612.
# 6 1994-02-28 65764.     2  1994  43612.
# 7 1994-03-31 66456      3  1994  43612.
# 8 1994-04-29 92069.     4  1994  43612.
# 9 1994-05-31 89300.     5  1994  43612.
# 10 1994-06-30 82452.     6  1994  43612.

由于没有前一年,您只需要定义填充NA的方式即可。

答案 2 :(得分:1)

这是另一种仅使用dplyr作为数据的df的解决方案。

您创建2个data.frames:

  • 一个带日期,我,年和月='12'
  • 一个具有new_var =我,年= {年+ 1},月的人

然后合并两个data.frames(我使用(data.table::) merge,但是您可以使用dplyr :: left_join,都很好)

,然后删除年月。

df %>% 
  {merge(x = transmute(., date, me, year = as.numeric(substr(date, 1, 4)), month = '12'),
         y = transmute(., new_var = me, year = as.numeric(substr(date, 1, 4)) + 1, month = substr(date, 6, 7)), 
         by = c('year', 'month'), 
         all.x = TRUE)} %>%
  select(-year, -month)

答案 3 :(得分:1)

上一个12月的me值是向后m行返回的值,其中m的1月为1,2月为2,依此类推,否则如果没有行{{1 }}后面的行是NA。计算m和顺序行号m,我们得到以下内容。不使用任何软件包。

ix

给予:

m <- as.numeric(format(DF$date, "%m"))
ix <- seq_len(nrow(DF))
transform(DF, me_dec = me[ifelse(ix - m < 1, NA, ix - m)])

答案 4 :(得分:0)

@neeraj,如果您使用多年,则RLave提供的解决方案将不起作用,因为12月的值将不正确。该值保持不变,但应为一年前的12月值,并且由于它是NA,因此以这种方式填充。

如果创建的变量等于new_var的前导,则可以使用他的解决方案。

    public class DialogCompanyAddress extends DialogFragment {

        public DialogCompanyAddress() {
            // Required empty public constructor
        }

        @NonNull
        @Override
        public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

            LayoutInflater inflater = getActivity().getLayoutInflater();

            builder.setView(inflater.inflate(R.layout.fragment_dialog_company_address,null));

            builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //save data to the firebase
                }
            });

            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Do
                }
            });

            return builder.create();
        }
    }

应纠正该答案。