R长数据帧和以数字格式读取列的有效方法

时间:2016-09-19 16:34:26

标签: r dataframe lapply strsplit

我正在使用Spanish Billion Words Corpus and Embeddings

处提供的word2vec数据

数据集看起来像这样

v1   v2  v3 
once 0.1 0.2
upon 0.3 0.4
a    0.5 0.6
time 0.7 0.8
... + thousands of lines and columns ...

这是我读取数据的代码,但最重要的是最后两行:

#install.packages("R.utils")
#install.packages("readr")
#install.packages("jsonlite")
library(R.utils)
library(readr)
library(jsonlite)

##############################

# word vectors in text format 

##############################

url <- "http://cs.famaf.unc.edu.ar/~ccardellino/SBWCE/SBW-vectors-300-min5.txt.bz2"
compressed <- "SBW-vectors-300-min5.txt.bz2"
file <- "SBW-vectors-300-min5.txt"
file2 <- "SBW-vectors-300-min5.RData"

if(!file.exists(compressed)) {
  print("downloading")
  download.file(url, compressed, method="curl")
}

if(!file.exists(file) & file.exists(compressed)) {
  bunzip2(compressed, file, remove = FALSE, skip = TRUE)
}

SBW_vectors_300_min5 <- readr::read_lines(file, skip = 1, n_max = -1L)
SBW_vectors_300_min5_df = as.data.frame(do.call(rbind, strsplit(SBW_vectors_300_min5, split = " ")), 
                                        stringsAsFactors=FALSE)

当我跑步时

SBW_vectors_300_min5 <- readr::read_lines(file, skip = 1, n_max = -1L)
SBW_vectors_300_min5_df = as.data.frame(do.call(rbind, strsplit(SBW_vectors_300_min5, split = " ")), 
                                            stringsAsFactors=FALSE)

我收到错误invalid subscript type 'list'

但是,如果我这样做

SBW_vectors_300_min5 <- readr::read_lines(file, skip = 1, n_max = -1L)
SBW_vectors_300_min5 = strsplit(SBW_vectors_300_min5, split = " ")
SBW_vectors_300_min5 = as.data.frame(SBW_vectors_300_min5)

我选择了最后一个选项,因为该工作没有错误消息。最后一个解决方案的问题是列被读作因子而且因子I不能进行主成分分析,除非我这样做

index <- sapply(values, is.factor)
SBW_vectors_300_min5 <- lapply(SBW_vectors_300_min5[index], function(x) as.numeric(as.character(x)))

计算时间超过24小时。如果我想让它重现,那么我必须考虑更高效的东西。

如何让SBW_vectors_300_min5_df = as.data.frame(do.call(rbind, strsplit(SBW_vectors_300_min5, split = " ")), stringsAsFactors=FALSE)工作?

0 个答案:

没有答案