示例数据(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()
阅读此数据? (如果可能,也要设置列名。)
答案 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