我的数据表如下:
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函数的工作量。 那么,如何使带有索引号的子集起作用?为什么我首先遇到上述错误?我想了解我的错误是什么。谢谢!
答案 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)
也将起作用。