如何使用fread将制表符分隔文件读入data.table?

时间:2015-08-12 08:15:11

标签: r data.table

示例数据(emp.data

Beth  4.00  0
Dan   3.75  0
Kathy 4.00  10
Mark  5.00  20
Mary  5.50  22
Susie 4.25  18

我可以使用data.frame将其读入read.table,然后将其转换为data.table

library(data.table)
df <- read.table("emp.data", col.names = c("Name", "PayRate", "HoursWorked"))
DT <- as.data.table(df, key = HoursWorked)

计算工资(过滤掉零小时):

DT[HoursWorked > 0, .(Name, Pay = PayRate * HoursWorked),]

    Name   Pay
1: Kathy  40.0
2:  Mark 100.0
3:  Mary 121.0
4: Susie  76.5

工作正常;但是,我认为转换中还有一个额外的步骤。由于fread()中有data.table,为什么不直接使用它?

readDT <- fread("emp.data", header=FALSE, sep="\t")

               V1
1:  Beth  4.00  0
2:  Dan   3.75  0
3: Kathy 4.00  10
4: Mark  5.00  20
5: Mary  5.50  22
6: Susie 4.25  18

 str(readDT)
Classes 'data.table' and 'data.frame':  6 obs. of  1 variable:
 $ V1: chr  "Beth  4.00  0" "Dan   3.75  0" "Kathy 4.00  10" "Mark  5.00  20" ...
 - attr(*, ".internal.selfref")=<externalptr> 

数据被识别为一列;显然这不起作用。

问题

如何正确使用fread()阅读此数据? (如果可能,也要设置列名。)

2 个答案:

答案 0 :(得分:7)

最近在devel版本v1.9.5(很快将在CRAN上以v1.9.6提供)修复了这个问题:

server()

有关详细信息,请参阅项目页面中的require(data.table) # v1.9.5+ fread("~/Downloads/tmp.txt") # V1 V2 V3 # 1: Beth 4.00 0 # 2: Dan 3.75 0 # 3: Kathy 4.00 10 # 4: Mark 5.00 20 # 5: Mary 5.50 22 # 6: Susie 4.25 18 README.md获得fread参数(在其他功能/错误修复中),默认为strip.white

更新:它现在也有TRUE参数:

col.names

答案 1 :(得分:5)

使用awk删除空格,然后使用fread阅读为我工作。

 DT <- fread("awk '{$1=$1}1' emp.data")
 DT 
 #      V1   V2 V3
 #1:  Beth 4.00  0
 #2:   Dan 3.75  0
 #3: Kathy 4.00 10
 #4:  Mark 5.00 20
 #5:  Mary 5.50 22
 #6: Susie 4.25 18

 str(DT)
 #Classes ‘data.table’ and 'data.frame':    6 obs. of  3 variables:
 #$ V1: chr  "Beth" "Dan" "Kathy" "Mark" ...
 #$ V2: num  4 3.75 4 5 5.5 4.25
 #$ V3: int  0 0 10 20 22 18
 # - attr(*, ".internal.selfref")=<externalptr> 

我能够用OP的代码

复制同样的问题
 fread("emp.data", header=FALSE, sep="\t")
 #               V1
 #1:  Beth  4.00  0
 #2:  Dan   3.75  0
 #3: Kathy 4.00  10
 #4: Mark  5.00  20
 #5: Mary  5.50  22
 #6: Susie 4.25  18