【发布时间】:2019-05-06 22:10:10
【问题描述】:
我想按组应用一个函数,该函数根据该组中的值将观察所属的区间分配给一个新变量。我觉得下面的代码应该可以工作,但它似乎使用了整个数据集,而不是组的最大值和最小值。我错过了什么?
#require(data.table)
#fake data
set.seed(12345)
df1 <- data.frame(id_f=c(rep("a a",100),rep("b b",100),rep("c c",100)),
L=c(abs(rnorm(100,50,20)),abs(rnorm(100,90,20)),abs(rnorm(100,220,20))),
w=abs(rnorm(300,6,3)))
dt2 = as.data.table(df1)
#the offending data.table function
dt2[,"bins":= findInterval(L, c((max(L)-min(L))/10*c(1:9)),left.open=T)+1, by=id_f]
编辑:
在“a a”列中,“a a”范围内将有 10 个等间距的 bin,并且将为每个原始观测值分配一个 bin 编号,因为真实数据有 6,000 个观测值,每个观测值都有多个成员斌。所以输出会是这样的:(为简洁起见,这是一个三间隔的例子)
id_f L w bins
a a 1 1.0 1
a a 2 1.1 2
a a 3 5.0 3
b b 3 2.0 1
b b 6 3.5 2
b b 9 7.0 3
c c 10 1.0 1
c c 15 1.5 2
c c 20 6.0 3
我原以为我对findInterval 的调用会完成此操作,但显然它从全球数据集中获取min 和max,而不仅仅是从组中获取。如何让它从组中获取min 和max,然后使用它来计算用于该组的间隔?
【问题讨论】:
-
cut()是执行此操作的内置函数,将其传递给显式的breaks参数。当您使用随机数据时,也请使用set.seed(),以使我们其他人可以重现这一点。经过多次编辑后,这个问题仍然无法重现,啊。 -
将来会设置.seed。谢谢。
标签: r data.table intervals