R在数据表中填写部分NA
我有以下数据表:R在数据表中填写部分NA,r,data.table,R,Data.table,我有以下数据表: dt <- data.table(date=rep(c(2014,2013), each=4), price=c(3.14, 1.45, 3.4 ,5.1, 1, 2.3, 2.79, 3), brand=rep(c("Mercedes", "Audi"), each=4), num=c(3,6,7,8,3,5,9,12), seller=rep(c("gregory", "dan"), each=4)) 我现在的目标是: date num price b
dt <- data.table(date=rep(c(2014,2013), each=4), price=c(3.14, 1.45, 3.4 ,5.1, 1, 2.3, 2.79, 3), brand=rep(c("Mercedes", "Audi"), each=4), num=c(3,6,7,8,3,5,9,12), seller=rep(c("gregory", "dan"), each=4))
我现在的目标是:
date num price brand seller
1: 2013 3 1.00 Audi dan
2: 2013 5 2.30 Audi dan
3: 2013 6 NA Audi dan
4: 2013 7 NA Audi dan
5: 2013 8 NA Audi dan
6: 2013 9 2.79 Audi dan
7: 2013 12 3.00 Audi dan
8: 2014 3 3.14 Mercedes gregory
9: 2014 5 NA Mercedes gregory
10: 2014 6 1.45 Mercedes gregory
11: 2014 7 3.40 Mercedes gregory
12: 2014 8 5.10 Mercedes gregory
13: 2014 9 NA Mercedes gregory
14: 2014 12 NA Mercedes gregory
我首先为每个日期的缺失num添加行:
setkey(dt, date, num)
dtt<-dt[CJ(unique(date), unique(dt[,num]))]
然后:
dtt[date==2013, c("brand","seller"):=list("Audi","dan")]
dtt[date==2014, c("brand","seller"):=list("Mercedes","gregory")]
给出想要的结果
然而:
1-最后一段代码已满
2-我想创建一个通用函数(或联接),因为我有很多不同的日期和列来替换/保留real data.table中的NA
看起来很简单,但我被卡住了 那么:
require(data.table) ## 1.9.2
setkey(dt, num)
nums = unique(dt$num)
dt[, list(price=.SD[J(nums)]$price, brand=brand[1L],
num=nums, seller=seller[1L]), by=date]
# date price brand num seller
# 1: 2014 3.14 Mercedes 3 gregory
# 2: 2014 NA Mercedes 5 gregory
# 3: 2014 1.45 Mercedes 6 gregory
# 4: 2014 3.40 Mercedes 7 gregory
# 5: 2014 5.10 Mercedes 8 gregory
# 6: 2014 NA Mercedes 9 gregory
# 7: 2014 NA Mercedes 12 gregory
# 8: 2013 1.00 Audi 3 dan
# 9: 2013 2.30 Audi 5 dan
# 10: 2013 NA Audi 6 dan
# 11: 2013 NA Audi 7 dan
# 12: 2013 NA Audi 8 dan
# 13: 2013 2.79 Audi 9 dan
# 14: 2013 3.00 Audi 12 dan
或者:
dt[, c(.SD[J(nums), list(price=price)], brand=brand[1L],
seller=seller[1L]), by=date]
其中列的顺序将不同
在
1.9.3
中,这将更加高效(在语法和速度方面),因为我们不必连接并返回所有列:
## 1.9.3
dt[, list(price=.SD[J(nums), price], brand=brand[1L],
num=nums, seller=seller[1L]), by=date]
.SD[J(nums),price]
将生成一个向量,而不是以前版本中的data.table
,并且不会执行隐式by(by而不是by),因此速度也会更快
有关详细信息,请查看v1.9.3实施的新FRs(第1点和第2点)
那么:
require(data.table) ## 1.9.2
setkey(dt, num)
nums = unique(dt$num)
dt[, list(price=.SD[J(nums)]$price, brand=brand[1L],
num=nums, seller=seller[1L]), by=date]
# date price brand num seller
# 1: 2014 3.14 Mercedes 3 gregory
# 2: 2014 NA Mercedes 5 gregory
# 3: 2014 1.45 Mercedes 6 gregory
# 4: 2014 3.40 Mercedes 7 gregory
# 5: 2014 5.10 Mercedes 8 gregory
# 6: 2014 NA Mercedes 9 gregory
# 7: 2014 NA Mercedes 12 gregory
# 8: 2013 1.00 Audi 3 dan
# 9: 2013 2.30 Audi 5 dan
# 10: 2013 NA Audi 6 dan
# 11: 2013 NA Audi 7 dan
# 12: 2013 NA Audi 8 dan
# 13: 2013 2.79 Audi 9 dan
# 14: 2013 3.00 Audi 12 dan
或者:
dt[, c(.SD[J(nums), list(price=price)], brand=brand[1L],
seller=seller[1L]), by=date]
其中列的顺序将不同
在
1.9.3
中,这将更加高效(在语法和速度方面),因为我们不必连接并返回所有列:
## 1.9.3
dt[, list(price=.SD[J(nums), price], brand=brand[1L],
num=nums, seller=seller[1L]), by=date]
.SD[J(nums),price]
将生成一个向量,而不是以前版本中的data.table
,并且不会执行隐式by(by而不是by),因此速度也会更快
有关详细信息,请查看v1.9.3实施的新FRs(第1点和第2点)
HTH您可以使用
roll
参数用最接近的值填充NA
。问题是,这也将填补价格
,但这很容易补救:
setkey(dt, date, num)
dt[CJ(unique(date), unique(num)), roll = 'nearest'][!dt, price := NA][]
# date price brand num seller
# 1: 2013 1.00 Audi 3 dan
# 2: 2013 2.30 Audi 5 dan
# 3: 2013 NA Audi 6 dan
# 4: 2013 NA Audi 7 dan
# 5: 2013 NA Audi 8 dan
# 6: 2013 2.79 Audi 9 dan
# 7: 2013 3.00 Audi 12 dan
# 8: 2014 3.14 Mercedes 3 gregory
# 9: 2014 NA Mercedes 5 gregory
#10: 2014 1.45 Mercedes 6 gregory
#11: 2014 3.40 Mercedes 7 gregory
#12: 2014 5.10 Mercedes 8 gregory
#13: 2014 NA Mercedes 9 gregory
#14: 2014 NA Mercedes 12 gregory
我认为这应该比
.SD[…]
解决方案快得多。您可以使用roll
参数用最接近的值填充NA
。问题是,这也将填补价格
,但这很容易补救:
setkey(dt, date, num)
dt[CJ(unique(date), unique(num)), roll = 'nearest'][!dt, price := NA][]
# date price brand num seller
# 1: 2013 1.00 Audi 3 dan
# 2: 2013 2.30 Audi 5 dan
# 3: 2013 NA Audi 6 dan
# 4: 2013 NA Audi 7 dan
# 5: 2013 NA Audi 8 dan
# 6: 2013 2.79 Audi 9 dan
# 7: 2013 3.00 Audi 12 dan
# 8: 2014 3.14 Mercedes 3 gregory
# 9: 2014 NA Mercedes 5 gregory
#10: 2014 1.45 Mercedes 6 gregory
#11: 2014 3.40 Mercedes 7 gregory
#12: 2014 5.10 Mercedes 8 gregory
#13: 2014 NA Mercedes 9 gregory
#14: 2014 NA Mercedes 12 gregory
我认为这应该比
.SD[…]
解决方案快得多。确定num
s集合的逻辑是什么?您似乎希望每个卖家都有num
in(3,5,6,7,8,9,12)。对吗?为什么?这是正确的,我希望每个日期都有num,然后填写卖家、品牌并保持NA的价格(如果我能一次性完成,那就太棒了!)。我们可以说num是代表发动机污染水平的标准值。之后我将使用它来预测缺失的价格。确定num
s集合的逻辑是什么?您似乎希望每个卖家都有num
in(3,5,6,7,8,9,12)。对吗?为什么?这是正确的,我希望每个日期都有num,然后填写卖家、品牌并保持NA的价格(如果我能一次性完成,那就太棒了!)。我们可以说num是代表发动机污染水平的标准值。之后我将使用它来预测缺失的价格。