我正在实施k-Means。这是我的主要数据结构:
dt1是一个带有{Filename,featureVector,GroupItBelongsTo}的Data.table
dt1<- data.table(Filename=files[1:limit],Vector=list(),G=-1)
setkey(dt1,Filename)
featureVector是一个列表。它有与出现相关的单词,我使用这一行添加每个单词的出现:
featureVector[[item]] <- emaildt[email==item]$N
拨打dt1
时,我的控制台的典型摘录是。
Filename Vector G
1: 000057219a473629b53d33cfedef590f.txt 1,1,1,1,1,1, 3
2: 00007afb5a5e467a39e517ae87e7fad5.txt 0,0,0,0,0,0, 3
3: 000946d248fdb1d5d05c59a91b00e8f2.txt 0,0,0,0,0,0, 3
4: 000bea8dc6f716a2cac6f25bdbe09073.txt 0,0,0,0,0,0, 3
我现在想为每个组号计算新的质心。 含义我想要将位置1上的所有向量位置相加,[2]等等。直到结束,之后 - 将它们全部平均。
示例:v1 = [1,1,1],v2 = [2,2,2],我希望质心为= c1 = [1,5; 1,5; 1,5]
我试图做到:sapply(dt1 [tt] $ Vector,意思)(也尝试用“sum”)并且它总和并且“意味着”逐行(在每个向量内),而不是列式(每个n-我喜欢这样做。
怎么做?
====更新,回答评论中的问题====
> head(dt1)
Filename Vector G
1: 000057219a473629b53d33cfedef590f.txt 1,1,1,1,1,1, 1
2: 00007afb5a5e467a39e517ae87e7fad5.txt 0,0,0,0,0,0, 1
3: 000946d248fdb1d5d05c59a91b00e8f2.txt 0,0,0,0,0,0, 3
4: 000bea8dc6f716a2cac6f25bdbe09073.txt 0,0,0,0,0,0, 4
5: 000fcfac9e0a468a27b5e2ad0f78d842.txt 0,0,0,0,0,0, 1
6: 00166a4964d6c939f8f62280b85e706d.txt 0,0,0,1,0,0, 1
> class(dt1)
[1] "data.table" "data.frame"
>
键入dt1$Vector
给出(我只复制了一个小样本,它有更多的单词,但它们看起来都一样):
[[1]]
homosexuality articles church people interest
1 1 1 1 1
thread email send warning worth
1 1 1 1 1
这是class()输出
> class(dt1$Vector)
[1] "list"
输入时的屏幕截图:
A<-as.matrix(t(as.data.frame(dt1$Vector)))
class(dt1$Vector[[1]])
的结果:
[1] "numeric"
答案 0 :(得分:3)
首先,(强制性的)您可以考虑使用R函数kmeans
来进行k-means聚类。如果您喜欢自己滚动,可以按如下方式轻松计算数据表的质心。首先,我将构建一些看起来像你的随机数据:
> set.seed(123)
> dt<-data.table(name=LETTERS[1:20],replicate(5,sample(0:4,20,T)),G=sample(3,20,T))
> head(dt)
name V1 V2 V3 V4 V5 G
1: A 1 4 0 3 1 2
2: B 3 3 2 0 3 1
3: C 2 3 2 1 2 2
4: D 4 4 1 1 3 3
5: E 4 3 0 4 0 2
6: F 0 3 0 2 2 3
质心可以用一行计算:
> dt[,lapply(.SD[,-1,with=F],mean),by=G]
G V1 V2 V3 V4 V5
1: 2 2.375000 2.250000 1.25 2.125000 2.250000
2: 1 2.800000 2.400000 2.40 1.800000 1.400000
3: 3 1.714286 2.428571 1.00 2.142857 1.857143
如果您要这样做,您可能希望从数据表中删除名称(暂时),在这种情况下您可以这样做:
> dt2<-copy(dt)
> dt2$name<-NULL
> dt2[,lapply(.SD,mean),by=G]
G V1 V2 V3 V4 V5
1: 2 2.375000 2.250000 1.25 2.125000 2.250000
2: 1 2.800000 2.400000 2.40 1.800000 1.400000
3: 3 1.714286 2.428571 1.00 2.142857 1.857143
编辑:@Roland建议的更好的方法是使用.SDcols
:
dt[,lapply(.SD,mean),by=G,.SDcols=2:6]