在 r 中的应用函数中使用 kmeans
using kmeans within an apply function in r
我今天面临新的挑战!我想分别在我的 table 的每一行上执行 kmeans(在我的例子中,这代表每月的天气数据)得到每个点和月份的 table 以及簇号。
插图
这里是数据的摘录(我总共有大约 1700 个观察结果,这里只显示 10 个)
data<-c(
245, 84 , 99 , 161, 249, 190 , 136 , 122 , 157, 128 , 123 , 138 , 106,
246, 84 , 101, 163 , 257, 194 , 138 , 126 , 163, 134 , 127 , 142 , 108,
247, 60 , 80 , 131, 191, 156 , 90 , 82 , 106 , 85 , 86 , 106 , 88,
248, 60 , 80 , 131 , 191, 156, 90 , 82, 106 , 85 , 86 , 106 , 88,
249 , 60 , 80 , 131, 191, 156, 90, 82, 106 , 85 , 86 , 106 , 88,
250 , 58 , 79 , 131, 197, 156, 90, 78, 101 , 84 , 84 , 106 , 88,
251 , 60 , 81 , 135, 210, 163, 91, 82, 107 , 88 , 89 , 108 , 89,
252 , 67 , 86 , 140, 214, 168, 105, 92, 121 , 99 , 99 , 114 , 93,
253, 70 , 89 , 144, 225, 171 , 110, 97, 128 , 105 , 104 , 118 , 94,
254, 70 , 89 , 144, 225, 171, 110, 97, 128 , 105 , 104 , 118 , 94,
255, 62 , 82, 134, 205, 163 , 94, 85, 110 , 88 , 90, 109, 89)
data<-matrix(data, nrow=10,ncol=13,byrow=FALSE)
data<-data.frame(data)
names(data)<-c('ID' ,'January' ,'Febuary', 'March', 'April', 'May' ,'June' ,'July' ,'August' ,'September' ,'October', 'November', 'December')
对每条观测线执行 kmeans 分类
如你所见,我使用 2 个集群
kmean<-apply(data[,2:13], 1, function(x) {kmeans(x, 2)})
太棒了,用 kmeans 报告创建了一个列表(也是列表,其中第二个是集群编号)
我可以查看特定行的簇号,比如第 2 行这样
kmean[[2]]$cluster
挑战
现在我想得到一个 table,它为我的数据框中的每个观察结果提供 kmean$cluster 的结果。
所以我尝试了以下方法:
cluster<-apply(kmean, 1, function (y) {kmean[[y]]$cluster})
但随后出现以下错误:
应用错误(kmean, 1, function(y) { :
dim(X) 必须具有正长度
有什么建议可以让我的 table 显示每行和每个月观察结果属于哪个集群?
非常感谢您看到这里!凯瑟琳
do.call(rbind, lapply(1:length(kmean), function(x) kmean[[x]]$cluster))
我今天面临新的挑战!我想分别在我的 table 的每一行上执行 kmeans(在我的例子中,这代表每月的天气数据)得到每个点和月份的 table 以及簇号。
插图
这里是数据的摘录(我总共有大约 1700 个观察结果,这里只显示 10 个)
data<-c(
245, 84 , 99 , 161, 249, 190 , 136 , 122 , 157, 128 , 123 , 138 , 106,
246, 84 , 101, 163 , 257, 194 , 138 , 126 , 163, 134 , 127 , 142 , 108,
247, 60 , 80 , 131, 191, 156 , 90 , 82 , 106 , 85 , 86 , 106 , 88,
248, 60 , 80 , 131 , 191, 156, 90 , 82, 106 , 85 , 86 , 106 , 88,
249 , 60 , 80 , 131, 191, 156, 90, 82, 106 , 85 , 86 , 106 , 88,
250 , 58 , 79 , 131, 197, 156, 90, 78, 101 , 84 , 84 , 106 , 88,
251 , 60 , 81 , 135, 210, 163, 91, 82, 107 , 88 , 89 , 108 , 89,
252 , 67 , 86 , 140, 214, 168, 105, 92, 121 , 99 , 99 , 114 , 93,
253, 70 , 89 , 144, 225, 171 , 110, 97, 128 , 105 , 104 , 118 , 94,
254, 70 , 89 , 144, 225, 171, 110, 97, 128 , 105 , 104 , 118 , 94,
255, 62 , 82, 134, 205, 163 , 94, 85, 110 , 88 , 90, 109, 89)
data<-matrix(data, nrow=10,ncol=13,byrow=FALSE)
data<-data.frame(data)
names(data)<-c('ID' ,'January' ,'Febuary', 'March', 'April', 'May' ,'June' ,'July' ,'August' ,'September' ,'October', 'November', 'December')
对每条观测线执行 kmeans 分类
如你所见,我使用 2 个集群
kmean<-apply(data[,2:13], 1, function(x) {kmeans(x, 2)})
太棒了,用 kmeans 报告创建了一个列表(也是列表,其中第二个是集群编号)
我可以查看特定行的簇号,比如第 2 行这样
kmean[[2]]$cluster
挑战
现在我想得到一个 table,它为我的数据框中的每个观察结果提供 kmean$cluster 的结果。
所以我尝试了以下方法:
cluster<-apply(kmean, 1, function (y) {kmean[[y]]$cluster})
但随后出现以下错误: 应用错误(kmean, 1, function(y) { : dim(X) 必须具有正长度
有什么建议可以让我的 table 显示每行和每个月观察结果属于哪个集群?
非常感谢您看到这里!凯瑟琳
do.call(rbind, lapply(1:length(kmean), function(x) kmean[[x]]$cluster))