1

好吧,昨天在我拥有的功能中,这对我来说效果很好。今天我对这个data.table有以下问题。我无法弄清楚我做错了什么或改变了什么来获得这种行为:

dtable
   TIF VENUE duration TYPE1 TYPE2 TYPE3 TYPE4 index order_type
1: DAY    NA  1.3e+07    NA   M:0    NA    NA     2         NA
2: DAY    NA  2.0e+06    NA   M:0    NA    NA     4         NA
3: DAY    NA  8.9e+07    NA   M:0    NA    NA     6         NA
4: IOC    NA  0.0e+00    NA    NA    NA    NA     1         NA
5: IOC    NA  0.0e+00    NA    NA    NA    NA     3         NA
6: IOC    NA  0.0e+00    NA    NA    NA    NA     5         NA

Classes:
        TIF       VENUE    duration       TYPE1       TYPE2       TYPE3       TYPE4    index    order_type
   "factor"    "factor"   "numeric"    "factor"    "factor"    "factor"    "factor"   "integer" "character"





cn = "TYPE2"
pattern = "M:?\\n*\\.?\\n*"
tif = "DAY"
> type
[1] mid-peg
Levels: ERROR? GTC? far-peg far-peg ping limit limit ping mid-peg mid-peg ping near-peg near-peg ping

index = grep(pattern, dtable[tif][, get(cn)])
index
> [1] 1 2 3

这失败了:

dtable[tif][index][,"order_type"] = type              
**Error during wrapup: Internal error: NA exist in 'rows' passed to C assign**

这有效:

dtable[tif][grep(pattern, dtable[tif][, get(cn)])][,"order_type"] = type
> dtable
   TIF VENUE duration TYPE1 TYPE2 TYPE3 TYPE4 index order_type
1: DAY    NA  1.3e+07    NA   M:0    NA    NA     2    mid-peg
2: DAY    NA  2.0e+06    NA   M:0    NA    NA     4    mid-peg
3: DAY    NA  8.9e+07    NA   M:0    NA    NA     6    mid-peg
4: IOC    NA  0.0e+00    NA    NA    NA    NA     1         NA
5: IOC    NA  0.0e+00    NA    NA    NA    NA     3         NA
6: IOC    NA  0.0e+00    NA    NA    NA    NA     5         NA

我在搞什么鬼?

我认为我的 R 会话已损坏,因此我提出了一个新会话,但它也失败了。

感谢您的时间。

(对不起,伙计们,第一次使用这个网站,所以我不应该把以下内容放在评论部分)建议使用 ....[,order_type :- type ]

这是:与上面相同的 dtable。我用上面相同的参数将示例留在内存中。

>dtable[tif][grep(pattern, dtable[tif][, get(cn)])][,order_type] 
[1] NA NA NA 

>dtable[tif][grep(pattern, dtable[tif][, get(cn)])][,order_type := type ] 
>dtable[tif][grep(pattern, dtable[tif][, get(cn)])][,order_type] 
[1] NA NA NA 

> type [1] mid-peg. 
[1] mid-peg
Levels: ERROR? GTC? far-peg far-peg ping limit limit ping mid-peg mid-peg ping near-peg near-peg ping

现在这样做之后,它可以工作:

> dtable[tif][grep(pattern, dtable[tif][, get(cn)])][,"order_type"] = type
> dtable[tif][grep(pattern, dtable[tif][, get(cn)])][,order_type] 
[1] "mid-peg" "mid-peg" "mid-peg"

如果这看起来很奇怪,我很抱歉。当我第一次开始这整件事时,我最初尝试过:

>index = grep(pattern, dtable[tif][, get(cn)])
>dtable[tif][index][,order_type := type ]

这没有用。我确实似乎(或认为)两天前我有以下工作:

>dtable[tif][index][,"order_type"] = type

但现在我收到错误:内部错误:NA 存在于传递给 C 分配的“行”中

在处理了一段时间之后,我很惊讶用 [grep(pattern, dtable[tif][, get(cn)])] 替换 [index] 可以正常工作,因为它应该是同一件事。所以这让我挠头回到上面的原始问题。

我大约一个月前才开始使用 data.table 。这对我来说是很大的优势和巨大的推动力,但我遇到了一些奇怪的怪癖,比如这个。所以我终于想我应该把它发布在那里,看看我做错了什么,或者我是否以非预期的方式使用 data.table。

完全忘了提,我用的是R3.0 谢谢大家。

4

1 回答 1

1
dtable[tif][index][,"order_type"] = type

如果 dtable 中没有名为“index”的列,它将起作用。否则“索引”被评估为列值,在这种情况下是 (2,4,6),它不会引用 dtable[tif] 中的有效行号。

于 2013-06-24T15:54:42.997 回答