如何使用data.table按组对变量的随机值进行子集化?

时间:2015-10-09 14:22:57

标签: r data.table subset random-sample

我希望在data.table中获取组中变量的最小值和随机样本。

data.table(ggplot2::movies)[, list(min=min(rating), random=sample(rating, 1)), by=list(year, Action)]

不起作用:

Error in `[.data.table`(data.table(movies), , list(min(rating), sample(rating,  : 
Column 2 of result for group 88 is type 'integer' but expecting type 'double'. Column types must be consistent for each group.

如果我强制数字化,我会得到这个令人惊讶的结果:随机评级 (?!!)的类别是同一类别的最小值。

data.table(ggplot2::movies)[, list(min=min(rating), random=as.numeric(sample(rating, 1))), by=list(year, Action)][random<min]
   year Action min random
1: 1916      1 6.2      6
2: 1911      1 5.7      1
3: 1901      1 4.2      3
4: 1914      1 6.1      6
5: 1923      1 8.2      4
6: 1918      1 5.9      5
7: 1921      1 7.5      4

使用.SD不会改变任何内容:

data.table(ggplot2::movies)[, list(min=min(rating), random=as.numeric(sample(.SD$rating, 1))), by=list(year, Action)][random<min]
   year Action min random
1: 1916      1 6.2      2
2: 1911      1 5.7      4
3: 1893      0 7.0      2
4: 1901      1 4.2      4
5: 1914      1 6.1      5
6: 1923      1 8.2      8
7: 1918      1 5.9      4

更糟糕的是,当变量为整数时不会出现错误:

data.table(ggplot2::movies)[, list(min=min(votes), random=sample(votes, 1)), by=list(year, Action)][random<min]
   year Action min random
1: 1916      1 135     43
2: 1911      1  26      2
3: 1893      0  90     52
4: 1901      1  13     12
5: 1923      1 757    368
6: 1918      1  60     49
7: 1921      1  73     48

显然sample函数不想处理子集...

帮助!

1 个答案:

答案 0 :(得分:2)

你陷入了标准的sample陷阱。来自?sample

  

如果x的长度为1,则为数字(在is.numeric意义上),x> = 1,   样品取样从1:x进行。注意这方便   当x具有不同的长度时,特征可能导致不希望的行为   调用样本(x)。

使用例如来自resample的{​​{1}}建议。