Свернуть значения по группам - PullRequest
0 голосов
/ 20 апреля 2020
CUSTOMER DATE    FEATURE 
1        202001     A       
1        202001     B        
1        202002     A
2        202001     C        
2        202002     A
2        202002     B
2        202002     C

У меня есть набор данных, как указано выше, и я хочу получать ФУНКЦИИ в каждый момент времени для каждого КЛИЕНТА, как показано ниже:

CUSTOMER DATE    FEATURE ALL_FEATURES
1        202001     A       A,B
1        202001     B       A,B
1        202002     A       A
2        202001     C       C 
2        202002     A       A,B,C
2        202002     B       A,B,C
2        202002     C       A,B,C

Я пробовал функцию dcast, например, dcast (df, CUSTOMER, DATE ~ ОСОБЕННОСТИ), чтобы отделить ОСОБЕННОСТИ, но тогда ситуация слишком сложна, чтобы завершить sh: есть 9 возможностей завершить ее sh, используя ifelse.

Как я могу просто завершить sh это ? Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Мы можем группировать по «ЗАКАЗЧИКУ», «ДАТА» и paste с str_c

library(dplyr)
library(stringr)
df1 %>%
   group_by(CUSTOMER, DATE) %>%
   mutate(ALL_FEATURES = str_c(FEATURE, collapse = ","))
# A tibble: 7 x 4
# Groups:   CUSTOMER, DATE [4]
#  CUSTOMER   DATE FEATURE ALL_FEATURES
#     <int>  <int> <chr>   <chr>       
#1        1 202001 A       A,B         
#2        1 202001 B       A,B         
#3        1 202002 A       A           
#4        2 202001 C       C           
#5        2 202002 A       A,B,C       
#6        2 202002 B       A,B,C       
#7        2 202002 C       A,B,C       

данных

df1 <- structure(list(CUSTOMER = c(1L, 1L, 1L, 2L, 2L, 2L, 2L), DATE = c(202001L, 
202001L, 202002L, 202001L, 202002L, 202002L, 202002L), FEATURE = c("A", 
"B", "A", "C", "A", "B", "C")), class = "data.frame", row.names = c(NA, 
-7L))
1 голос
/ 20 апреля 2020

Одна базовая опция R использует ave, например,

df <- within(df,ALL_FEATURES <- ave(FEATURE,CUSTOMER,DATE,FUN = list))

или

df <- within(df,ALL_FEATURES <- ave(FEATURE,CUSTOMER,DATE,FUN = toString))

, так что

> df
  CUSTOMER   DATE FEATURE ALL_FEATURES
1        1 202001       A         A, B
2        1 202001       B         A, B
3        1 202002       A            A
4        2 202001       C            C
5        2 202002       A      A, B, C
6        2 202002       B      A, B, C
7        2 202002       C      A, B, C

DATA

df <- structure(list(CUSTOMER = c(1L, 1L, 1L, 2L, 2L, 2L, 2L), DATE = c(202001L, 
202001L, 202002L, 202001L, 202002L, 202002L, 202002L), FEATURE = c("A", 
"B", "A", "C", "A", "B", "C")), class = "data.frame", row.names = c(NA, 
-7L))
...