Есть ли способ отфильтровать DataFrame по уникальным переменным, хранящимся в другом DataFrame в R - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь отфильтровать список вложенных фреймов данных на основе переменных в другом фрейме данных и создать новый фрейм данных для каждой группирующей переменной после применения фильтра.

Пример набора данных и группы

combined <- data.frame(
  client = c('aaa','aaa','aaa','bbb','bbb','ccc','ccc','ddd','ddd'),
  type = c('norm','reg','opt','norm','norm','reg','opt','opt','opt'),
  age = c('>50','>50','75+','<25','<25','>50','75+','25-50','25-50'),
  IsActive = c('1','0','0','1','1','0','1','1','1')
)

# get unique variable combinations
unique_vars <- combined %>% 
  distinct() %>%
  group_split(client)

Я думаю, что комбинации переменных в unique_vars могут быть применены к исходному кадру данных combined для создания индивидуальных кадров данных на основе уникальных переменных для каждого клиента. результат, который я хочу создать, представляет собой фрейм данных для каждой комбинации переменных для каждого клиента в исходном фрейме данных и их уникальных переменных. Так, например, будет 3 фрейма данных, созданных для клиента «aaa» на основе unique_vars[1], но только 1 фрейм данных, созданный для клиента «ddd» на основе unique_vars[4], так как существует только одна строка возможных комбинаций переменных для клиента «ddd "

Есть какой-нибудь совет, как это сделать?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

с помощью команды distinct из dplyr

split(distinct(combined),row.names(distinct(combined)))

дает

$`1`
  client type age IsActive
1    aaa norm >50        1

$`2`
  client type age IsActive
2    aaa  reg >50        0

$`3`
  client type age IsActive
3    aaa  opt 75+        0

$`4`
  client type age IsActive
4    bbb norm <25        1

$`5`
  client type age IsActive
5    ccc  reg >50        0

$`6`
  client type age IsActive
6    ccc  opt 75+        1

$`7`
  client type   age IsActive
7    ddd  opt 25-50        1
1 голос
/ 08 мая 2020

Один из вариантов, включающий dplyr и purrr, может быть:

map(.x = combined %>%
     distinct() %>%
     group_split(rowid = 1:n()),
    ~ combined %>%
     inner_join(.x))

[[1]]
  client type age IsActive rowid
1    aaa norm >50        1     1

[[2]]
  client type age IsActive rowid
1    aaa  reg >50        0     2

[[3]]
  client type age IsActive rowid
1    aaa  opt 75+        0     3

[[4]]
  client type age IsActive rowid
1    bbb norm <25        1     4
2    bbb norm <25        1     4

[[5]]
  client type age IsActive rowid
1    ccc  reg >50        0     5

[[6]]
  client type age IsActive rowid
1    ccc  opt 75+        1     6

[[7]]
  client type   age IsActive rowid
1    ddd  opt 25-50        1     7
2    ddd  opt 25-50        1     7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...