R 预期结果中的输出差异

R 预期结果中的输出差异,r,tidyverse,R,Tidyverse,我有这样的数据输入: 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 =

我有这样的数据输入:

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
但我收到了这个结果

#一个tible:16 x 2
股票
1亚马逊-雅虎产品2
2产品-雅虎产品2
3雅虎-雅虎产品2
4谷歌-雅虎产品股票2
5产品-雅虎产品库存2
6股票-雅虎产品股票4
7雅虎-雅虎产品股票2
8产品亚马逊2
9雅虎亚马逊2
10谷歌股票谷歌3
11产品谷歌股票2
12股票谷歌股票5
13雅虎谷歌股票2
14雅虎产品库存产品1
15雅虎产品股票1
16雅虎产品股票雅虎1

使用
table()
并不是我的案例的最佳解决方案,因为我的真实数据集有更多数据

您是否正在寻找类似的解决方案(如下所示)。如果是这样,我将对每个步骤进行注释。基本上,它根据逗号分割字符串,清理空白,对分割的部分进行排序,用“-”将它们折叠在一起,并使用
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
拆分股票%
计数()%>%
排列(描述(n))
#一个tibble:4x2
股票
1亚马逊-雅虎产品2
2谷歌股票-雅虎产品股票2
3谷歌股票1
4雅虎产品库存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"))

df1您是否正在寻找类似的产品(如下所示)。如果是这样,我将对每个步骤进行注释。基本上,它根据逗号分割字符串,清理空白,对分割的部分进行排序,用“-”将它们折叠在一起,并使用
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
拆分股票%
计数()%>%
排列(描述(n))
#一个tibble:4x2
股票
1亚马逊-雅虎产品2
2谷歌股票-雅虎产品股票2
3谷歌股票1
4雅虎产品库存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"))

df1您不需要使用
full\u join()

使用
separate_rows()
通过
id
识别所有公司
stocks
,然后使用
group_by()
/
summary()
和函数
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
df%>%
单行(库存)%>%
筛选器(!%c('库存','产品')中的库存%)%>%
分组依据(id)%>%
汇总(组库存=粘贴(排序(库存),折叠=“”))%>%
盘点(集团库存)
#集团股票
#           
#1亚马逊雅虎2
#2谷歌1
#3谷歌雅虎2
#4雅虎1

您不需要使用
完全连接()

使用
separate_rows()
通过
id
识别所有公司
stocks
,然后使用
group_by()
/
summary()
和函数
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
df%>%
单行(库存)%>%
筛选器(!%c('库存','产品')中的库存%)%>%
分组依据(id)%>%
汇总(组库存=粘贴(排序(库存),折叠=“”))%>%
盘点(集团库存)
#集团股票
#           
#1亚马逊雅虎2
#2谷歌1
#3谷歌雅虎2
#4雅虎1