【问题标题】:How to convert frequency into text by using R?如何使用 R 将频率转换为文本?
【发布时间】:2016-11-19 13:21:21
【问题描述】:

我有这样的数据框(ID,频率 A B C D E)

ID A B C D E    
1  5 3 2 1 0  
2  3 2 2 1 0  
3  4 2 1 1 1

我想将此数据框转换为这样的基于测试的文档(ID 和它们的频率 ABCDE 作为单列中的单词)。然后我可以使用LDA算法来识别每个ID的热门话题。

ID                     Text
1   "A" "A" "A" "A" "A" "B" "B" "B" "C" "C" "D"
2   "A" "A" "A" "B" "B" "C" "C" "D"
3   "A" "A" "A" "A" "B" "B" "C" "D" "E"

【问题讨论】:

    标签: r text frequency lda


    【解决方案1】:

    我们可以使用data.table

    library(data.table)
    DT <- setDT(df1)[,.(list(rep(names(df1)[-1], unlist(.SD)))) ,ID]
    DT$V1
    #[[1]]
    #[1] "A" "A" "A" "A" "A" "B" "B" "B" "C" "C" "D"
    
    #[[2]]
    #[1] "A" "A" "A" "B" "B" "C" "C" "D"
    
    #[[3]]
    #[1] "A" "A" "A" "A" "B" "B" "C" "D" "E"
    

    或者base R 选项是split

    lst <- lapply(split(df1[-1], df1$ID), rep, x=names(df1)[-1])
    lst
    #$`1`
    #[1] "A" "A" "A" "A" "A" "B" "B" "B" "C" "C" "D"
    
    #$`2`
    #[1] "A" "A" "A" "B" "B" "C" "C" "D"
    
    #$`3`
    #[1] "A" "A" "A" "A" "B" "B" "C" "D" "E"
    

    如果我们想将“lst”写入 csv 文件,一种选择是将list 转换为data.frame,方法是在末尾附加NA 以使长度相等,同时转换为data.frame(如@ 987654330@ 是等长的list(列))

    res <- do.call(rbind, lapply(lst, `length<-`, max(lengths(lst))))
    

    或者使用stringi的方便函数

    library(stringi)
    res <- stri_list2matrix(lst, byrow=TRUE)
    

    然后使用write.csv

    write.csv(res, "yourdata.csv", quote=FALSE, row.names = FALSE)
    

    【讨论】:

      【解决方案2】:

      您可以像这样使用applyrep

      apply(df[-1], 1, function(i) rep(names(df)[-1], i))
      

      对于每一行,applyrep 函数提供重复每个变量名称的次数。这会返回一个向量列表:

      [[1]]
       [1] "A" "A" "A" "A" "A" "B" "B" "B" "C" "C" "D"
      
      [[2]]
      [1] "A" "A" "A" "B" "B" "C" "C" "D"
      
      [[3]]
      [1] "A" "A" "A" "A" "B" "B" "C" "D" "E"
      

      每个列表元素都是 data.frame 的一行。

      数据

      df <- read.table(header=T, text="ID A B C D E    
      1  5 3 2 1 0  
      2  3 2 2 1 0  
      3  4 2 1 1 1")
      

      【讨论】:

      • 感谢您的回答。我还有一个问题:如何将输出写入 csv。文件?
      • 列表的设计不适合写入 csv,因为 csvs 需要矩形数据。如果你在 R 中工作,你应该使用 saveload 而不是 write.csvread.csv。如果您需要写入 csv 并且由于这超出了您的第一个问题的范围,我认为这将是一个很好的第二个问题。从您从这些答案中收到的列表数据开始。我在 SO 上寻找了一个类似的问题,因为我确定存在一个,但找不到。
      猜你喜欢
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多