样本数据(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
Run Code Online (Sandbox Code Playgroud)
我可以把它读成一个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)
Run Code Online (Sandbox Code Playgroud)
计算工资(过滤掉零小时):
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
Run Code Online (Sandbox Code Playgroud)
这很好; 但是,我认为转换还有一个额外的步骤.由于有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>
Run Code Online (Sandbox Code Playgroud)
数据被识别为一列; 显然这不起作用.
题
如何fread()正确阅读这些数据?(如果可能,也要设置列名.)
最近在devel版本v1.9.5中已经修复了这个版本(将很快在CRAN上以v1.9.6的形式提供):
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
Run Code Online (Sandbox Code Playgroud)
有关README.md详细信息,请参阅项目页面.fread获得了strip.white争论(在其他功能/错误修复中),默认情况下TRUE.
更新:它col.names现在也有争论:
fread("~/Downloads/tmp.txt", col.names = c("Name", "PayRate", "HoursWorked"))
# Name PayRate HoursWorked
# 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
Run Code Online (Sandbox Code Playgroud)
使用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>
Run Code Online (Sandbox Code Playgroud)
我能够用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
Run Code Online (Sandbox Code Playgroud)