Выходная разница в ожидаемом результате - PullRequest
0 голосов
/ 13 мая 2019

У меня есть такой ввод данных:

df <- data.frame(id = c(1,2,3,4,5,6), stocks = c("google stock, yahoo product stock", "google stock, yahoo product stock","amazon, yahoo product","yahoo product, amazon","yahoo product stock", "google stock"))

Я ожидал получить такой результат:

df <- data.frame(id = c(1,2,3,4,5,6), stocks = c("google stock, yahoo product stock", "google stock, yahoo product stock","amazon, yahoo product stock","yahoo product stock, amazon","yahoo product stock", "google stock"))
                              combination frequency
    1 google stock - yahoo product stock       2
    2        amazon - yahoo product stock         2
    3                 yahoo product stock         1
    4                        google stock         1

Я пробовал это:

library(tidyverse)
 df %>%
     separate_rows(stocks, sep = ",") %>%
     full_join(df %>%
                   separate_rows(stocks), by = c("id" = "id")) %>%
     filter(stocks.x != stocks.y) %>%
     count(stocks.x, stocks.y) %>%
     transmute(stocks = paste(pmax(stocks.x, stocks.y), pmin(stocks.x, stocks.y), sep = "-"),
               n) %>%
     distinct(stocks, .keep_all = TRUE)

но я получаю этот результат

# A tibble: 16 x 2
   stocks                           n
   <chr>                        <int>
 1 amazon- yahoo product            2
 2 product- yahoo product           2
 3 yahoo- yahoo product             2
 4 google- yahoo product stock      2
 5 product- yahoo product stock     2
 6 stock- yahoo product stock       4
 7 yahoo- yahoo product stock       2
 8 product-amazon                   2
 9 yahoo-amazon                     2
10 google stock-google              3
11 product-google stock             2
12 stock-google stock               5
13 yahoo-google stock               2
14 yahoo product stock-product      1
15 yahoo product stock-stock        1
16 yahoo product stock-yahoo        1

Использование table() не является оптимальным решением для моего случая, так как мой реальный набор данных больше данных

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Вам не нужно использовать full_join().

Используйте separate_rows() для идентификации всей компании stocks по id, затем используйте group_by() / summarise() с функцией paste(collapse = ' '), чтобы объединить различные возможности в вашем stocks переменная.Наконец, используйте count() для своих нужд.

df %>% 
  separate_rows(stocks) %>% 
  filter(!stocks %in% c('stock', 'product')) %>% 
  group_by(id) %>% 
  summarise(group_stocks = paste(sort(stocks), collapse = ' ')) %>% 
  count(group_stocks)

#   group_stocks     n
#   <chr>        <int>
# 1 amazon yahoo     2
# 2 google           1
# 3 google yahoo     2
# 4 yahoo            1
1 голос
/ 13 мая 2019

Вы ищете что-то подобное (ниже).Если так, я буду комментировать каждый шаг.По сути, он разделяет вашу строку на основе запятой, очищает пробелы, сортирует разделенные части, сворачивает их вместе с «-» и использует функции dpylr для получения количества.Я сделал много предположений, поэтому дайте мне знать, если это не работает для вас.Кроме того, это может быть быстрее сделать в data.table в зависимости от количества групп , но я остановился на dplyr, потому что это то, что вы использовали.Удачи !!

split_stock <- lapply(strsplit(as.character(df1$stocks), ",", fixed = T), function(x) sort(trimws(x)))

df1$stocks2 <- sapply(split_stock, paste0, collapse = " - ")

df1 %>%
  group_by(stocks2) %>%
  count() %>%
  arrange(desc(n))

# A tibble: 4 x 2
  stocks2                                n
  <chr>                              <int>
1 amazon - yahoo product                 2
2 google stock - yahoo product stock     2
3 google stock                           1
4 yahoo product stock                    1

Данные :

df1 <- data.frame(id = c(1,2,3,4,5,6), stocks = c("google stock, yahoo product stock", "google stock, yahoo product stock","amazon, yahoo product","yahoo product, amazon","yahoo product stock", "google stock"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...