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