我甚至不确定data.table是否可行。我有一个如下所示的数据集。它是一个数据框,但我后来转换为data.table,称为x
id xcord ycord
a 2 3
a 3 4
a 3 3
a 9 10
a 8 9
b 1 3
b 1 2
b 8 19
b 7 21
我想识别每个id两个集群,这证明是困难的。我尝试了以下
x = x[,list(x1 = kmeans(xcord,centers=2)$centers, y1 = kmeans(ycord,centers=2)$centers,by = id]
但它给出了以下错误消息。
All items in j=list(...) should be atomic vectors or lists. If you are trying something like j=list(.SD,newcol=mean(colA)) then use := by group instead (much quicker), or cbind or merge afterwards.
Calls: [ -> [.data.table
Execution halted
我期待一个数据表,其条目可以“处理”为中心列表。这甚至可能吗?
答案 0 :(得分:4)
centers
元素是一个矩阵(它将包含与x
kmeans
参数中的列一样多的列。
如果要在同一群集中找到考虑xcord
和ycord
的群集,则需要将矩阵传递给kmeans
。然后,您将不得不强制回到data.table。这将使名字明智。
# eg.
fx <- x[,data.table(kmeans(cbind(xcord,ycord),centers=2)$centers),by=id]
fx
# id xcord ycord
# 1: a 2.666667 3.333333
# 2: a 8.500000 9.500000
# 3: b 7.500000 20.000000
# 4: b 1.000000 2.500000