ifelse使用dplyr导致一些记录的NA

时间:2016-07-14 22:35:56

标签: r dplyr

我对编程很新,对R来说很新。

问题

当使用带有嵌套ifelse语句的dplyr的mutate函数时,我会获得一些记录的结果,并为其他记录更正。我不知道为什么我会得到NAs。

期望

运行以下代码时,我的期望是会发生以下情况:

  • active_m0将创建所有仍然“活跃”的记录。 (定义为那些没有cancel_datecancel_date等于或等于join_date月份和年份的记录。
  • active_m1将创建所有仍然“活跃”的记录。与join_date相比,下个月。

-

tom35 <- mutate(tom35, active_m0 = sum(
         ifelse(is.na(cancel_date), 
                 1, 
                 ifelse(year(cancel_date) == year(join_date) & 
                              month(cancel_date) == month(join_date),
                         0, 
                         ifelse(year(cancel_date) == year(join_date) & 
                                     month(cancel_date) < month(join_date), 
                                           0, 
                                           1)))))

tom35 <- mutate(tom35, active_m1 = sum(
           ifelse(is.na(cancel_date), 
                 1, 
                 ifelse(year(cancel_date) == year(join_date) & 
                              month(cancel_date) == month(join_date + months(1)),
                         0, 
                         ifelse(year(cancel_date) == year(join_date) & 
                                      month(cancel_date) < month(join_date + months(1)), 
                                         0, 
                                         1)))))

现状

  • active_m0部分似乎工作正常。
  • 但是,active_m1正在为数据集中的56248个记录中的33000个工作。剩下的就是人口普查而不是总和。

我的数据

我将数据子集化为具有active_m1的正确总和的数据:

  

head(select(tom35_clean,join_date,cancel_date,cohort,total_joins,active_m0,active_m1))   来源:本地数据框[6 x 6]   团体:队列[5]

   join_date cancel_date  cohort total_joins active_m0 active_m1
      <date>      <date>  <fctr>       <int>     <dbl>     <dbl>
1 2015-04-23  2015-05-27  2015-4        6493      5953      3806
2 2014-09-22  2014-11-27  2014-9        4093      3614      2275
3 2015-07-07  2015-07-31  2015-7        1923      1719       671
4 2014-11-14  2015-12-09 2014-11        3808      3515      2165
5 2015-04-23  2016-06-04  2015-4        6493      5953      3806
6 2015-02-16  2015-02-25  2015-2        9051      8411      5480


> str(select(tom35_clean, join_date, cancel_date, cohort, total_joins, active_m0, active_m1))
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 33010 obs. of  6 variables:
 $ join_date  : Date, format: "2015-04-23" "2014-09-22" "2015-07-07" "2014-11-14" ...
 $ cancel_date: Date, format: "2015-05-27" "2014-11-27" "2015-07-31" "2015-12-09" ...
 $ cohort     : Factor w/ 31 levels "2014-1","2014-10",..: 19 12 22 3 19 17 17 12 19 17 ...
 $ total_joins: int  6493 4093 1923 3808 6493 9051 9051 4093 6493 9051 ...
 $ active_m0  : num  5953 3614 1719 3515 5953 ...
 $ active_m1  : num  3806 2275 671 2165 3806 ...
 - attr(*, "vars")=List of 1
  ..$ : symbol cohort
 - attr(*, "drop")= logi TRUE
 - attr(*, "indices")=List of 24
  ..$ : int  3 19 20 21 26 36 40 48 49 57 ...
  ..$ : int  10 25 42 86 96 128 156 174 186 209 ...
  ..$ : int  17 169 858 1571 2072 2074 2079 2399 2797 2914 ...
  ..$ : int  233 234 411 434 560 828 954 3008 3384 4179 ...
  ..$ : int  827 1561 2403 2510 4354 4371 4381 4430 4431
  ..$ : int  13 85 124 277 281 301 377 439 533 568 ...
  ..$ : int  11 29 31 50 51 66 67 84 109 125 ...
  ..$ : int  1 7 24 27 33 47 54 71 73 92 ...
  ..$ : int  201 1605 1819 32857
  ..$ : int  1206 1898 3436 4440 8267
  ..$ : int  56 101 264 685 748 1280 3587 30604
  ..$ : int  5 6 9 12 16 23 30 32 35 38 ...
  ..$ : int  0 4 8 14 15 18 37 41 44 52 ...
  ..$ : int  34 61 114 119 142 160 161 195 212 213 ...
  ..$ : int  2 22 59 60 64 80 89 91 141 148 ...
  ..$ : int  162 435 31958 33005
  ..$ : int 11278
  ..$ : int  130 131 1196 14167 33006
  ..$ : int  46 138 331 420 498 2802 2966 3026 9610 33007
  ..$ : int  28 145 2751 16513 17922
  ..$ : int  1398 3140 25718 25719
  ..$ : int  33008 33009
  ..$ : int  865 16497
  ..$ : int 172
 - attr(*, "group_sizes")= int  3808 2477 96 17 9 1549 1829 4093 4 5 ...
 - attr(*, "biggest_group_size")= int 9051
 - attr(*, "labels")='data.frame':  24 obs. of  1 variable:
  ..$ cohort: Factor w/ 31 levels "2014-1","2014-10",..: 3 4 5 6 7 9 10 12 14 15 ...
  ..- attr(*, "vars")=List of 1
  .. ..$ : symbol cohort
  ..- attr(*, "drop")= logi TRUE

填充了NAs的数据而不是active_m1的总和:

> head(select(tom35_nas, join_date, cancel_date, cohort, total_joins, active_m0, active_m1))
Source: local data frame [6 x 6]
Groups: cohort [5]

   join_date cancel_date cohort total_joins active_m0 active_m1
      <date>      <date> <fctr>       <int>     <dbl>     <dbl>
1 2015-03-04  2015-04-17 2015-3        4354      4005        NA
2 2015-05-06  2015-07-02 2015-5        4494      4048        NA
3 2014-05-29        <NA> 2014-5        1325      1201        NA
4 2015-03-05  2015-05-10 2015-3        4354      4005        NA
5 2014-08-19  2014-09-26 2014-8        4502      4069        NA
6 2014-01-02        <NA> 2014-1        1622      1406        NA


> str(select(tom35_nas, join_date, cancel_date, cohort, total_joins, active_m0, active_m1))
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 23248 obs. of  6 variables:
 $ join_date  : Date, format: "2015-03-04" "2015-05-06" "2014-05-29" "2015-03-05" ...
 $ cancel_date: Date, format: "2015-04-17" "2015-07-02" NA "2015-05-10" ...
 $ cohort     : Factor w/ 31 levels "2014-1","2014-10",..: 18 20 8 18 11 1 18 13 2 1 ...
 $ total_joins: int  4354 4494 1325 4354 4502 1622 4354 3615 3336 1622 ...
 $ active_m0  : num  4005 4048 1201 4005 4069 ...
 $ active_m1  : num  NA NA NA NA NA NA NA NA NA NA ...
 - attr(*, "vars")=List of 1
  ..$ : symbol cohort
 - attr(*, "drop")= logi TRUE
 - attr(*, "indices")=List of 7
  ..$ : int  5 9 12 17 24 51 57 89 95 96 ...
  ..$ : int  8 13 20 28 30 33 37 59 60 61 ...
  ..$ : int  2 27 29 35 49 82 83 92 110 111 ...
  ..$ : int  4 21 23 25 38 46 50 52 67 74 ...
  ..$ : int  7 18 26 39 40 41 53 54 64 69 ...
  ..$ : int  0 3 6 11 16 22 36 45 47 48 ...
  ..$ : int  1 10 14 15 19 31 32 34 42 43 ...
 - attr(*, "group_sizes")= int  1622 3336 1325 4502 3615 4354 4494
 - attr(*, "biggest_group_size")= int 4502
 - attr(*, "labels")='data.frame':  7 obs. of  1 variable:
  ..$ cohort: Factor w/ 31 levels "2014-1","2014-10",..: 1 2 8 11 13 18 20
  ..- attr(*, "vars")=List of 1
  .. ..$ : symbol cohort
  ..- attr(*, "drop")= logi TRUE

正在使用lubridate和dplyr。

我无法弄清楚为什么这对active_m1不起作用。任何帮助表示赞赏。

0 个答案:

没有答案