使用“ []”子集数据表时出错,但使用$ -operator子集错误

时间:2019-08-29 06:36:51

标签: r data.table subset

我的数据表如下:

require(data.table)
df <- data.table(Day = seq(as.Date('2014-01-01'), as.Date('2014-12-31'), by = 'days'), Number = 1:365)

我想对数据表进行子集处理,以便它仅返回前10行中大于10的值。

df2 <- subset(df[1:110,], df$Number[1:110] > 10)

一切正常。但是,如果我使用

df2 <- subset(df[1:110,],  df[1:110,2] > 10)

R返回以下错误:

Error in `[.data.table`(x, r, vars, with = FALSE) : 
  i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). Please report to data.table issue tracker if you'd like this, or add your comments to FR #657.

子集方式应该不同吗?问题是我想在apply命令中使用此子集,因此,数据表的名称会更改。因此,我不能将列名与$ -operator一起使用来引用第二列,并希望使用索引号,但是它不起作用。我可以重命名数据表列或读出列的名称并使用$ -operator,但是我的apply函数运行在许多条目上,并且我想最小化apply函数的工作量。 那么,如何使带有索引号的子集起作用?为什么我首先遇到上述错误?我想了解我的错误是什么。谢谢!

1 个答案:

答案 0 :(得分:4)

首先让我们了解为什么在您的情况下它不起作用。

df[1:110,2] > 10

#       Number
#  [1,]  FALSE
#  [2,]  FALSE
#  [3,]  FALSE
#  [4,]  FALSE
#  [5,]  FALSE
#  [6,]  FALSE
#  [7,]  FALSE
#....

它返回一个1列的矩阵,用于子设置。

class(df[1:110,2] > 10)
#[1] "matrix"

在数据框上正常工作

df1 <- data.frame(df)
subset(df1[1:110,],  df1[1:110,2] > 10)

#           Day Number
#11  2014-01-11     11
#12  2014-01-12     12
#13  2014-01-13     13
#14  2014-01-14     14
#15  2014-01-15     15
#....

,但不在data.table上。不幸的是,子集在data.table中不起作用。您可以将其转换为向量而不是矩阵,然后将其用于子集

subset(df[1:110,],  df[1:110][[2]] > 10)

#            Day Number
#  1: 2014-01-11     11
#  2: 2014-01-12     12
#  3: 2014-01-13     13
#  4: 2014-01-14     14
#  5: 2014-01-15     15
#...

看到结果时,差异会更加明显

df[matrix(TRUE), ]

vs

df1[matrix(TRUE), ]

PS-在第一种情况下

subset(df[1:110,], Number > 10)

也将起作用。