数据列上的R data.table setkey

时间:2014-07-06 14:40:35

标签: r data.table

我们真的需要添加J()来选择数字列吗?

我们可以在没有J()的情况下获得字符列的结果。

library(data.table)
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)  
DT["a"]  
#    x y v
# 1: a 1 1
# 2: a 3 2
# 3: a 6 3

setkey(DT,y)  
DT["1"]  
# Error in `[.data.table`(DT, "1") : 
#  typeof x.y (double) != typeof i.y (character)

# Is it a bug?

DT[J(1)]
#    y x v
# 1: 1 a 1
# 2: 1 b 4
# 3: 1 c 7

谢谢!

1 个答案:

答案 0 :(得分:5)

DT[1]DT[J(1)]不同的原因是我们可能需要两种不同的解释:

  1. 第一行DT[1]
  2. 密钥等于1DT[J(1)]
  3. 的所有行

    如果第一个参数是数字,则只存在潜在的歧义,这就是为什么这两种情况有两种不同的符号。

    在字符键的情况下,这种潜在的歧义不会出现,因为字符参数只能表示第二种情况。

    此外,DT["1"]是问题代码中的错误,因为示例中的键不是字符,而data.table不会在此处执行类型强制。