генерировать новую переменную на основе старения другой переменной - PullRequest
1 голос
/ 08 февраля 2020

Мне нравится набор данных, как показано ниже

ID. Invoice. Date of Invoice.  paid or not.  

1    1         10/31/2019       yes
1    1         10/31/2019       yes
1    2         11/30/2019       no
1    3         12/31/2019       no

2    1         09/30/2019       no
2    2         10/30/2019       no
2    3         11/30/2019       yes

3    1         7/31/2019        no
3    2         9/30/2019        yes
3    3         12/31/2019       no

4    1         7/31/2019        yes
4    2         9/30/2019        no
4    3         12/31/2019       yes

Я хотел бы знать, готова ли клиент платить. Пока клиент оплатил новый счет, а старый счет не был оплачен, я получу хорошую оценку. поэтому для клиентов 1 и 3 я дал «хорошо», а для клиента 2 - «плохо».

, поэтому окончательные данные будут иметь еще один столбец со значениями хорошего и плохого.

ID. Выставленный счет. Дата счета-фактуры. платный или нет. Плохо или хорошо

1    1         10/31/2019       yes          bad
1    1         10/31/2019       yes          bad
1    2         11/30/2019       no           bad
1    3         12/31/2019       no           bad

2    1         09/30/2019       no           good
2    2         10/30/2019       no           good
2    3         11/30/2019       yes          good

3    1         7/31/2019        no           good
3    2         9/30/2019        yes          good
3    3         12/31/2019       no           good

4    1         7/31/2019        yes          good
4    2         9/30/2019        no           good
4    3         12/31/2019       yes          good

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Если ваш Date of Invoice. уже заказан, то вот базовое решение R с использованием ave

df$`good or band.` <- ave(df$`paid or not.`,df$ID., FUN = function(v) ifelse(which(v=="yes")==1,"bad","good"))

таким, что

> df
  ID. Invoice. Date of Invoice. paid or not. good or band.
1   1        1       09/30/2019           no          good
2   1        2       10/30/2019           no          good
3   1        3       11/30/2019          yes          good
4   2        1       10/31/2019          yes           bad
5   2        2       11/30/2019           no           bad
6   2        3       12/31/2019           no           bad
7   3        1        7/31/2019           no          good
8   3        2        9/30/2019          yes          good
9   3        3       12/31/2019           no          good

ДАННЫЕ

df <- structure(list(ID. = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), Invoice. = c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), `Date of Invoice.` = c("09/30/2019", 
"10/30/2019", "11/30/2019", "10/31/2019", "11/30/2019", "12/31/2019", 
"7/31/2019", "9/30/2019", "12/31/2019"), `paid or not.` = c("no", 
"no", "yes", "yes", "no", "no", "no", "yes", "no")), class = "data.frame", row.names = c(NA, 
-9L))
2 голосов
/ 08 февраля 2020

Непонятно про логи c. Может быть, мы можем проверить «да» в любой из строк, кроме первой, после группировки по «ID»

library(dplyr)
library(lubridate)
df1 %>% 
   mutate(Date_of_Invoice = mdy(Date_of_Invoice)) %>% 
   arrange(ID, Date_of_Invoice) %>%
   group_by(ID) %>%
   mutate(flag = c('bad', 'good')[1 + any(paid_or_not[-1] == "yes")])
# A tibble: 9 x 5
# Groups:   ID [3]
#     ID Invoice Date_of_Invoice paid_or_not flag 
#  <int>   <int> <date>          <chr>       <chr>
#1     1       1 2019-09-30      no          good 
#2     1       2 2019-10-30      no          good 
#3     1       3 2019-11-30      yes         good 
#4     2       1 2019-10-31      yes         bad  
#5     2       2 2019-11-30      no          bad  
#6     2       3 2019-12-31      no          bad  
#7     3       1 2019-07-31      no          good 
#8     3       2 2019-09-30      yes         good 
#9     3       3 2019-12-31      no          good 

data

df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), Invoice = c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), Date_of_Invoice = c("09/30/2019", 
"10/30/2019", "11/30/2019", "10/31/2019", "11/30/2019", "12/31/2019", 
"7/31/2019", "9/30/2019", "12/31/2019"), paid_or_not = c("no", 
"no", "yes", "yes", "no", "no", "no", "yes", "no")), class = "data.frame", row.names = c(NA, 
-9L))
...