0

这个问题是对上一个问题的详细说明,我曾询问过关于在按顺序标记的数据帧上重复功能的问题

过去,我需要做一些小改动才能data.tables从文件夹读入 R(例如更改日期、重新编码)。

但是,现在我的目标有点复杂:我想从一个文件夹中读取几个文本文件,从这些字符 vectos 中随机抽取一个样本,将随机样本读入语料库(使用 package tm)然后生成data.frame具有单词/短语及其频率列表的新词。

到目前为止我开发的代码如下:

BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 5)) # Finds words or phrases
files <- list.files("~/path/", full.names = TRUE, pattern="\\.txt$") # Reads in files

out <- lapply(1:length(files), function(x) {
  df <- scan(files[x], what="", sep="\n") # Read in files
  df<-sample(c(df),size=1500,replace=F) # Take random sample
  corpus <- Corpus(VectorSource(df)) # Create corpus
  corpus <- tm_map(corpus, stripWhitespace)
  corpus <- tm_map(corpus, tolower)
  corpus <- tm_map(corpus, removeWords, stopwords("english"))
  tdm <- TermDocumentMatrix(corpus, control = list(tokenize = BigramTokenizer)) #Create term document matrix
  m <- as.matrix(tdm)
  v <- sort(rowSums(m),decreasing=TRUE)
  d <- data.frame(word = names(v),freq=v) # Create new dataframe with words & their frequencies
})

但是,尽管此功能有效,但我不确定如何仅访问 data.framesd而丢弃其余部分?是否out包含在 中创建的所有对象lapply

4

2 回答 2

2

lapply函数返回一个列表,其中包含指定函数返回的值。在您的示例中,该函数仅返回分配给的数据框d,因此out将是一个仅包含d数据框的列表。该函数创建的所有其他对象(例如tdmmv)都将被丢弃,这似乎是您想要的。

您可以通过索引它们来访问数据帧out,如在 out[[1]] 中,使用 lapply,如 in lapply(out, function(d) d$word),或通过将它们与do.call('rbind', out).

于 2013-05-09T17:59:00.727 回答
0

谢谢,但这就是我得到的

do.call('rbind', out)

rbind(deparse.level, ...) 中的错误:参数的列数不匹配

我用了

lapply(seq_along(d.names), 
       function(i,x) {assign(paste0("a",i),x[[i]], envir=.GlobalEnv)},
       x=out) 

我想保留原始数据框名称,所以我这样做了

lapply(seq_along(d.names), 
   function(i,x) {assign(paste0(d.names[i],i),x[[i]], envir=.GlobalEnv)},
   x=out) 

它奏效了

感谢您的意见

于 2017-08-24T20:03:24.747 回答