Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R在数据表中填写部分NA_R_Data.table - Fatal编程技术网

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是代表发动机污染水平的标准值。之后我将使用它来预测缺失的价格。