fread在列中指定分隔符

fread在列中指定分隔符,r,dataset,R,Dataset,我试图解析一个2列列表,该列表使用多个空格表示列,单个空格表示列中的单词。我尝试过的任何方法都没有成功地将数据拆分为两列。我该怎么做 library(data.table) item.ids<-fread("http://eve-files.com/chribba/typeid.txt",sep2=" ") 这里有一种方法,使用“tidyr”中的提取,应该很容易理解 首先,我们读取中的数据,并检查前几行和最后几行。经检查,我们发现数据值为第3行至22384行 x <- readLi

我试图解析一个2列列表,该列表使用多个空格表示列,单个空格表示列中的单词。我尝试过的任何方法都没有成功地将数据拆分为两列。我该怎么做

library(data.table)
item.ids<-fread("http://eve-files.com/chribba/typeid.txt",sep2=" ")

这里有一种方法,使用“tidyr”中的
提取
,应该很容易理解

首先,我们读取中的数据,并检查前几行和最后几行。经检查,我们发现数据值为第3行至22384行

x <- readLines("http://eve-files.com/chribba/typeid.txt")
# Check out the data
head(x) # Let's get rid of the first two lines...
tail(x) # ... and the last 3


另一种方法可能是使用
strsplit
[]{2,}
作为分割值
do.call(rbind,…)
将是后面的习惯用法,但您可能只想筛选拆分导致两个值的情况

do.call(rbind, Filter(function(z) length(z) == 2, strsplit(x, "[ ]{2, }")))

这里有一种方法,使用“tidyr”中的
提取
,应该很容易理解

首先,我们读取中的数据,并检查前几行和最后几行。经检查,我们发现数据值为第3行至22384行

x <- readLines("http://eve-files.com/chribba/typeid.txt")
# Check out the data
head(x) # Let's get rid of the first two lines...
tail(x) # ... and the last 3


另一种方法可能是使用
strsplit
[]{2,}
作为分割值
do.call(rbind,…)
将是后面的习惯用法,但您可能只想筛选拆分导致两个值的情况

do.call(rbind, Filter(function(z) length(z) == 2, strsplit(x, "[ ]{2, }")))
这似乎有效:

library(readr)
url = "http://eve-files.com/chribba/typeid.txt"
df = read_fwf(url, fwf_empty(url), skip = 2)
colnames = read_table(url, n_max = 1)
names(df) = names(colnames)
df = na.omit(df)

dim(df)
# [1] 22382     2
summary(df)
 #    typeID         typeName        
 # Min.   :     0   Length:22382      
 # 1st Qu.: 13986   Class :character  
 # Median : 22938   Mode  :character  
 # Mean   : 53827                     
 # 3rd Qu.: 30209                     
 # Max.   :368620    
这似乎有效:

library(readr)
url = "http://eve-files.com/chribba/typeid.txt"
df = read_fwf(url, fwf_empty(url), skip = 2)
colnames = read_table(url, n_max = 1)
names(df) = names(colnames)
df = na.omit(df)

dim(df)
# [1] 22382     2
summary(df)
 #    typeID         typeName        
 # Min.   :     0   Length:22382      
 # 1st Qu.: 13986   Class :character  
 # Median : 22938   Mode  :character  
 # Mean   : 53827                     
 # 3rd Qu.: 30209                     
 # Max.   :368620    

逐行读取文本文件:

l <- list()
fileName <- "http://eve-files.com/chribba/typeid.txt"
conn <- file(fileName,open="r")
linn <-readLines(conn)
for (i in 1:length(linn)){
   l[i] <- list(linn[i])
}
close(conn)

逐行读取文本文件:

l <- list()
fileName <- "http://eve-files.com/chribba/typeid.txt"
conn <- file(fileName,open="r")
linn <-readLines(conn)
for (i in 1:length(linn)){
   l[i] <- list(linn[i])
}
close(conn)

这看起来更像是固定宽度,而不是固定宽度。看看“iotools”或“readr”软件包。另外,如果你不考虑它的话,
#
将是一个问题。或者只是在base中读取
read.fwf
。这看起来更像是固定宽度,而不是delimted。看看“iotools”或“readr”软件包。另外,如果你不解释的话,
#
将是一个问题。或者只是在base中阅读
read.fwf
。这是我最初的评论中的想法,但没有进一步探讨+1是的,我真的很惊讶你在回答中没有走那条路线。我尝试了一点
read.fwf
,但它给了我行名方面的问题,而且似乎很难解决。
readr
版本更友好。基本的
read.fwf
速度非常慢,因此
read\u fwf
实际上是一个非常受欢迎的文件输入选项……这是我在最初的评论中想到的,但没有进一步探讨+1是的,我真的很惊讶你在回答中没有走那条路线。我尝试了一点
read.fwf
,但它给了我行名方面的问题,而且似乎很难解决。
readr
版本更友好。基本的
read.fwf
速度非常慢,因此
read\u fwf
实际上是一个非常受欢迎的文件输入选项的添加。。。。
l_new_frame <- data.frame(do.call('rbind', l_new))

l_new_frame <- l_new_frame[-c(1,2),]
names(l_new_frame) <- c('typeID', 'typeName')
print(l_new_frame[1:100,], row.names = FALSE)