Разбить строку на столбцы с условиями в R - PullRequest
4 голосов
/ 25 октября 2019

У меня есть датафрейм как

+----+-------+---------+
| ID | VALUE |  DATE   |
+----+-------+---------+
|  1 |    10 | 2019-08 |
|  2 |    12 | 2018-05 |
|  3 |    45 | 2019-03 |
|  3 |    33 | 2018-03 |
|  1 |     5 | 2018-08 |
|  2 |    98 | 2019-05 |
|  4 |    67 | 2019-10 |
|  4 |    34 | 2018-10 |
|  1 |    55 | 2018-07 |
|  2 |    76 | 2019-08 |
|  2 |    56 | 2018-12 |
+----+-------+---------+

. Я пытаюсь разделить значение и дату на значение1 и значение2, а также данные1 и дату2 на основе текущего года (годаsystemdate) и годом ранее

Но здесь возникает условие, если сочетание даты и месяца в DATE основной таблицы совпадает с текущим значением systemdate, тогда не учитывается дата последних лет

Также игнорировать вседаты значений, которые появляются до года systemdate. Результирующий вывод будет выглядеть как

Здесь, в результате ID 1,2 и 3 имели соответствующие значения для одного и того же месяца в этом году и в прошлом году, поэтому мы разделим ихКроме того, мы не рассматривали результаты прошлых лет для идентификатора 4, так как его месяц в этом году совпадает с комбинацией год-месяц systemdate, и мы также игнорируем все значения из последнего года, для которых в этом году нет соответствующего месяца. (ID 1 для 2018-07 и 2 для 2018-12 в этом примере)

+----+---------+---------+--------+--------+
| ID |  DATE1  |  DATE2  | VALUE1 | VALUE2 |
+----+---------+---------+--------+--------+
|  1 | 2019-08 | 2018-08 |     10 | 5      |
|  2 | 2019-05 | 2018-05 |     98 | 12     |
|  3 | 2019-03 | 2018-03 |     45 | 33     |
|  4 | 2019-10 | NA      |     67 | NA     |
|  2 | 2019-08 | NA      |     76 | NA     |
+----+---------+---------+--------+--------+

1 Ответ

2 голосов
/ 25 октября 2019

Я думаю, вы могли бы сначала получить все в правильном формате:

df <- data.frame(ID = c(1, 2, 3, 3, 1, 2, 4, 4, 1, 2, 2), 
 VALUE = c(10, 12, 45, 33, 5, 98, 67, 34, 55, 76, 56), 
 DATE = c("2019-08", "2018-05", "2019-03","2018-03", 
    "2018-08","2019-05", "2019-10", "2018-10", 
    "2018-07", "2019-08", "2018-12"))

library(tidyverse)
df <- df %>% mutate(
  year = str_split_fixed(DATE, "-", 2)[,1],  
  month = str_split_fixed(DATE, "-", 2)[,2]) %>% 
  pivot_wider(
    names_from = year,
    values_from = c(VALUE, DATE)) 

Затем вы можете отфильтровать и удалить те значения, которые вам не нужны, в соответствии с вашей логикой. Возможно, я не до конца понимаю ваше системное время, но предположу, что это строка «2019-10». Это может быть что-то вроде этого:

df %>% 
  filter(!is.na(VALUE_2019)) %>% 
  mutate(
    VALUE_2018 = ifelse(DATE_2019 == "2019-10", NA, VALUE_2018), 
    DATE_2018 = ifelse(DATE_2019 == "2019-10", NA, as.character(DATE_2018)))

# A tibble: 5 x 6
     ID month VALUE_2019 VALUE_2018 DATE_2019 DATE_2018
  <dbl> <chr>      <dbl>      <dbl> <fct>     <chr>    
1     1 08            10          5 2019-08   2018-08  
2     2 05            98         12 2019-05   2018-05  
3     3 03            45         33 2019-03   2018-03  
4     4 10            67         NA 2019-10   NA       
5     2 08            76         NA 2019-08   NA   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...