我希望在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
函数不想处理子集...
帮助!
答案 0 :(得分:2)
你陷入了标准的sample
陷阱。来自?sample
:
如果x的长度为1,则为数字(在is.numeric意义上),x> = 1, 样品取样从1:x进行。注意这方便 当x具有不同的长度时,特征可能导致不希望的行为 调用样本(x)。
使用例如来自resample
的{{1}}建议。