Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-Yelp数据业务类别列中每个业务有多个类别。要将值为1和0的列分隔为特定于类别的列吗_R_Dataframe_Yelp - Fatal编程技术网

R-Yelp数据业务类别列中每个业务有多个类别。要将值为1和0的列分隔为特定于类别的列吗

R-Yelp数据业务类别列中每个业务有多个类别。要将值为1和0的列分隔为特定于类别的列吗,r,dataframe,yelp,R,Dataframe,Yelp,提前感谢您为任何人谁将尝试和帮助这一点 我使用的是Yelp数据集,我想回答的问题是“对于X类,哪些类别与更高的恒星正相关(例如条形图)” 我遇到的问题是,对于每个业务,每个业务id的类别都集中在一列和一行中。因此,我需要一种方法来分离每个类别,将它们转换为列,然后检查原始类别列是否包含创建该列的类别 我目前的思路是使用带有business\u id的group\u by,然后unnest\u标记该列,然后model.matrix()将该列划分为我想要的部分,然后将其加入到我正在使用的df中。但我

提前感谢您为任何人谁将尝试和帮助这一点

我使用的是Yelp数据集,我想回答的问题是“对于X类,哪些类别与更高的恒星正相关(例如条形图)”

我遇到的问题是,对于每个业务,每个业务id的类别都集中在一列和一行中。因此,我需要一种方法来分离每个类别,将它们转换为列,然后检查原始类别列是否包含创建该列的类别

我目前的思路是使用带有business\u id的group\u by,然后unnest\u标记该列,然后model.matrix()将该列划分为我想要的部分,然后将其加入到我正在使用的df中。但我无法让model.matrix通过并保持业务id连接到每一行

# an example of what I am using #
df <- 
  data_frame(business_id = c("bus_1",
                             "bus_2", 
                             "bus_3"),
             categories=c("Pizza, Burgers, Caterers",
                          "Pizza, Restaurants, Bars",
                          "American, Barbeque, Restaurants"))

# what I want it to look like #
desired_df <- 
  data_frame(business_id = c("bus_1",
                             "bus_2",
                             "bus_3"),
             categories=c("Pizza, Burgers, Caterers",
                          "Pizza, Restaurants, Bars",
                          "American, Barbeque, Restaurants"),
             Pizza = c(1, 1, 0),
             Burgers = c(1, 0, 0),
             Caterers = c(1, 0, 0),
             Restaurants = c(0, 1, 1),
             Bars = c(0, 1, 0),
             American = c(0, 0, 1),
             Barbeque = c(0, 0, 1))

# where I am stuck #
df %>%
  select(business_id, categories) %>% 
  group_by(business_id) %>% 
  unnest_tokens(categories, categories, token = 'regex', pattern=", ") %>%
  model.matrix(business_id ~ categories, data = .) %>% 
  as_data_frame
#我正在使用的示例#
df%
分组人(业务id)%>%
unnest_标记(类别,类别,标记='regex',pattern=“,”)%>%
模型.矩阵(业务id~类别,数据=)%>%
as_数据_帧
编辑:在这篇文章和下面的答案之后,我使用spread()遇到了一个重复的标识符错误。这把我带到了这个帖子,我的问题的答案被贴在这里,我已经在下面重新贴过了

#使用较小的data.frame复制错误#

库(tidyverse)
df#A tible:5 x 2
#>年龄性别
#>     
#>121男
#>2 17女
#>3 32名女性
#>429男
#>5 15男
df%>%
传播(关键=性别,价值=年龄)
#>错误:行(2,3)、(1,4,5)的标识符重复
#解决问题#

df%>%
按(vars(-age))%>%分组#按值列以外的所有内容分组。
mutate(row_id=1:n())%%>%ungroup()%%>%#生成组索引
传播(关键=性别,价值=年龄)%>%#传播
选择(-row_id)#删除索引
#>#tibble:3 x 2
#>男女
#>     
#> 1 17     21   
#> 2 32     29   
#>3 NA 15

以下是一个简单的tidyverse解决方案:

library(tidyverse)

df %>% 
  mutate(
    ind = 1,
    tmp = strsplit(categories, ", ")
  ) %>% 
  unnest(tmp) %>% 
  spread(tmp, ind, fill = 0)
## A tibble: 3 x 9
#  business_id categories                      American Barbeque  Bars Burgers Caterers Pizza Restaurants
#  <chr>       <chr>                              <dbl>    <dbl> <dbl>   <dbl>    <dbl> <dbl>       <dbl>
#1 bus_1       Pizza, Burgers, Caterers               0        0     0       1        1     1           0
#2 bus_2       Pizza, Restaurants, Bars               0        0     1       0        0     1           1
#3 bus_3       American, Barbeque, Restaurants        1        1     0       0        0     0           1
库(tidyverse)
df%>%
变异(
ind=1,
tmp=strsplit(类别,“,”)
) %>% 
未测试(tmp)%>%
排列(tmp、ind、填充=0)
##一个tibble:3x9
#商务分类美国烧烤酒吧汉堡餐饮店比萨饼餐厅
#                                                           
#1辆巴士1比萨饼、汉堡、餐饮服务商0 0 1 1 0
#2辆巴士2比萨饼、餐厅、酒吧0 0 1 0 1 1
#3辆公共汽车3辆美国车,烧烤,餐厅1 100 1

以下是一个简单的tidyverse解决方案:

library(tidyverse)

df %>% 
  mutate(
    ind = 1,
    tmp = strsplit(categories, ", ")
  ) %>% 
  unnest(tmp) %>% 
  spread(tmp, ind, fill = 0)
## A tibble: 3 x 9
#  business_id categories                      American Barbeque  Bars Burgers Caterers Pizza Restaurants
#  <chr>       <chr>                              <dbl>    <dbl> <dbl>   <dbl>    <dbl> <dbl>       <dbl>
#1 bus_1       Pizza, Burgers, Caterers               0        0     0       1        1     1           0
#2 bus_2       Pizza, Restaurants, Bars               0        0     1       0        0     1           1
#3 bus_3       American, Barbeque, Restaurants        1        1     0       0        0     0           1
库(tidyverse)
df%>%
变异(
ind=1,
tmp=strsplit(类别,“,”)
) %>% 
未测试(tmp)%>%
排列(tmp、ind、填充=0)
##一个tibble:3x9
#商务分类美国烧烤酒吧汉堡餐饮店比萨饼餐厅
#                                                           
#1辆巴士1比萨饼、汉堡、餐饮服务商0 0 1 1 0
#2辆巴士2比萨饼、餐厅、酒吧0 0 1 0 1 1
#3辆公共汽车3辆美国车,烧烤,餐厅1 100 1

根据您对
tidytext::unnest_tokens()的良好使用,您还可以使用此替代解决方案

library(dplyr)
library(tidyr)
library(tidytext)

df %>%
  select(business_id, categories) %>% 
  group_by(business_id) %>% 
  unnest_tokens(categories, categories, token = 'regex', pattern=", ") %>% 
  mutate(value = 1) %>% 
  spread(categories, value, fill = 0)
# business_id american barbeque  bars burgers caterers pizza restaurants
# <chr>          <dbl>    <dbl> <dbl>   <dbl>    <dbl> <dbl>       <dbl>
# bus_1              0        0     0       1        1     1           0
# bus_2              0        0     1       0        0     1           1
# bus_3              1        1     0       0        0     0           1
库(dplyr)
图书馆(tidyr)
图书馆(tidytext)
df%>%
选择(业务id,类别)%>%
分组人(业务id)%>%
unnest_标记(类别,类别,标记='regex',pattern=“,”)%>%
变异(值=1)%>%
排列(类别、值、填充=0)
#美国烧烤吧汉堡餐饮店比萨饼餐厅
#                               
#巴士1 0 0 1 1 0
#总线2 0 0 1 0 1 1 1
#总线3 1 0 0 0 1

根据您对
tidytext::unnest_tokens()的良好使用,您还可以使用此替代解决方案

library(dplyr)
library(tidyr)
library(tidytext)

df %>%
  select(business_id, categories) %>% 
  group_by(business_id) %>% 
  unnest_tokens(categories, categories, token = 'regex', pattern=", ") %>% 
  mutate(value = 1) %>% 
  spread(categories, value, fill = 0)
# business_id american barbeque  bars burgers caterers pizza restaurants
# <chr>          <dbl>    <dbl> <dbl>   <dbl>    <dbl> <dbl>       <dbl>
# bus_1              0        0     0       1        1     1           0
# bus_2              0        0     1       0        0     1           1
# bus_3              1        1     0       0        0     0           1
库(dplyr)
图书馆(tidyr)
图书馆(tidytext)
df%>%
选择(业务id,类别)%>%
分组人(业务id)%>%
unnest_标记(类别,类别,标记='regex',pattern=“,”)%>%
变异(值=1)%>%
排列(类别、值、填充=0)
#美国烧烤吧汉堡餐饮店比萨饼餐厅
#                               
#巴士1 0 0 1 1 0
#总线2 0 0 1 0 1 1 1
#总线3 1 0 0 0 1

非常感谢您提供了这个简明的答案!非常感谢您的简明回答!嘿,我只是想更新一下。我遇到了重复的标识符错误。它将我引向这个线程,在那里发布了它的解决方案。啊,是的,
spread()
在无法识别唯一行时可能会遇到困难。很高兴你找到了解决办法。作为替代方案,我强烈建议
{cdata}
满足您的数据转换需求。但是,
spread()
更适合您当前的工作流程。嘿,我只是想更新一下。我遇到了重复的标识符错误。它将我引向这个线程,在那里发布了它的解决方案。啊,是的,
spread()
在无法识别唯一行时可能会遇到困难。很高兴你找到了解决办法。作为替代方案,我强烈建议
{cdata}
满足您的数据转换需求。但是,
spread()
更适合您当前的工作流程。