代码之家  ›  专栏  ›  技术社区  ›  Ben G

如何将列表列的项转换为它们自己的列,以在R中找到余弦相似性?

  •  0
  • Ben G  · 技术社区  · 7 年前

    我有一个如下所示的数据集:

    library(tidyverse)
    
    data <- tibble(id = 1:10,
                   vectors = list(rnorm(25)))
    
    # A tibble: 25 x 2
          id vectors   
       <int> <list>    
     1     1 <dbl [25]>
     2     2 <dbl [25]>
     3     3 <dbl [25]>
     4     4 <dbl [25]>
     5     5 <dbl [25]>
     6     6 <dbl [25]>
     7     7 <dbl [25]>
     8     8 <dbl [25]>
     9     9 <dbl [25]>
    10    10 <dbl [25]>
    

    cosine 功能来自 lsa 包似乎是一种很好/简单的方法,但是我需要将每个文档表示为一列。我只想做一些简单的事情 data %>% t() unest 和 spread flatten 无济于事。我所需输出的第一行如下所示:

      1    2    3    4    5    6    7    8    9    10
    0.1  0.3  0.7  0.3  0.1  0.1  0.3  0.7  0.3  0.1
    

    如果有一个来自另一个包的函数处理这种格式的数据,我当然会用它来代替,尽管在这一点上,我想从好奇的角度来理解这一点。我看过 R - list to data frame ,但我不确定如何将其应用于这种情况。

    这方面的背景是,我已经使用gensim在python中执行了doc2vec,但对我们的工作环境没有影响,如果我想为客户机构建一些交互式的东西,它需要在R中。

    1 回复  |  直到 7 年前
        1
  •  1
  •   iod    7 年前
    require(dplyr)
    require(tidyr)
    mutate(data,vectors=sapply(vectors, function(x) paste(x,collapse=","))) %>% 
        separate_rows(vectors,sep=",") %>% 
        group_by(id) %>% 
        mutate(numb=row_number(),vectors=as.numeric(vectors)) %>%
        spread(key=numb,value=vectors)
    
    # A tibble: 10 x 26
    # Groups:   id [10]
          id   `1`   `2`   `3`   `4`    `5`   `6`    `7`   `8`     `9`  `10`  `11`  `12`   `13`   `14`  `15`   `16`
       <int> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>  <dbl> <dbl>   <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl>  <dbl>
     1     1  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
     2     2  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
     3     3  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
     4     4  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
     5     5  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
     6     6  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
     7     7  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
     8     8  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
     9     9  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
    10    10  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
    # ... with 9 more variables: `17` <dbl>, `18` <dbl>, `19` <dbl>, `20` <dbl>, `21` <dbl>, `22` <dbl>, `23` <dbl>,
    #   `24` <dbl>, `25` <dbl>
    

    我发现,首先将数据收集成一种长数据格式,这样最容易传播数据。我们通过使用 separate_rows . 这里的问题是,我们首先需要将向量中的列表转换成一些东西 分隔行 我们可以一起工作。我们使用 paste 具有 collapse=","

    推荐文章