用apply函数

时间:2016-05-06 17:40:11

标签: r for-loop lapply sapply strsplit

我正在使用for循环来创建文档字词矩阵。我的实际问题是使用一个名为RMeCab的模糊包来标记日文文本,但这里使用strsplit标准等效。我目前的代码:

Documents <- data.frame(Names= c("A","B"),Texts=c("A string of words","A different string"), stringsAsFactors = FALSE)
OUTPUT <- NULL
COMBINED <- NULL
i <- 1
for (i in 1:length(Documents$Texts)){
  OUTPUT <- data.frame(unlist(strsplit(Documents$Texts, " ")))
  OUTPUT$doc <- Documents$Names[i]
  COMBINED <- rbind(COMBINED, OUTPUT)
}
Document_Term_Matrix <- as.data.frame.matrix(table(COMBINED))

它有效,但我想使用更高效的apply功能。如果我跑

L_OUTPUT <- lapply(Documents[,2],function(x) strsplit(x, " "))

我将单独的单词作为列表的元素,但如何从Documents $ Names附加文档名称?

更具体地说,列表结构:

[[1]]

これ です   は ぺん 

   1    1    1    1 

[[2]]

です   は   人   彼 

   1    1    1    1 

如何使用这样的列获取数据 これ は ぺん です 彼 は 人 です 第二列显示文档名称 一一二一二二二

与列表元素[[1]],[[2]]等对应的那些词

2 个答案:

答案 0 :(得分:2)

最好使用tm等软件包进行这类操作,但这是一个使用基础R的解决方案,

list1 <- strsplit(Documents$Texts, ' ')
v1 <- unique(unlist(list1))

Document_Term_Matrix <- as.data.frame(t(sapply(v1, function(i) lapply(list1, function(j)
                                                                      sum(grepl(i, j))))))
names(Document_Term_Matrix)<- Documents$Names
Document_Term_Matrix
#          A B
#A         1 1
#string    1 1
#of        1 0
#words     1 0
#different 0 1

答案 1 :(得分:0)

您可以使用tm包中适用于大型文本数据集的函数:

library(tm)

# create corpora from your documents
corp = VCorpus(DataframeSource(Documents), readerControl = list(reader = readTabular(mapping = list(content = "Texts", id = "Names"))))

# create term document matrix
tdm = TermDocumentMatrix(corp, control = list(tokenize = function(x) unlist(strsplit(as.character(x), "[[:space:]]+"))
                                          , stopwords = FALSE
                                          , tolower = TRUE
                                          , weighting = weightTf))
inspect(tdm)

# get the result as matrix
tdm.m = matrix(tdm, nrow = tdm$nrow, ncol = tdm$ncol)
rownames(tdm.m) = tdm$dimnames$Terms
colnames(tdm.m) = tdm$dimnames$Docs

我也认为你的问题有误(但我不能添加评论)。 您的for循环中缺少[i],因此您可以获得所有文档中的术语总数。它应该是这样的:

OUTPUT <- data.frame(unlist(strsplit(Documents$Texts[i], " ")))