我已经筛选了几个链接1,2,3和4,仅举几例,但我似乎无法正确解决我的具体问题 .
问题
我有以下数据框:
df <- read.csv("crime_data", header=TRUE)
head(df)
我在数据上应用了K-means,并添加了一个额外的列 cluster
,所以现在我想将它们分类为人口最多的前50个城市和人口最少的前50个城市,这给了我以下内容:
df_sorted_asc <- df[with(df, order(population, city)), ]
head(df_sorted_asc)
工作得很好......现在我的城市按升序排序,但这里是我遇到麻烦的地方,年份数从1到35,但不是每个城市都有35,有些从21-35,一些从2到10,它变化很大,但所有城市的域名肯定是1-35 . 我最终想要一个数据框,其中行作为前50个最小的独特城市,接下来是前50个最大的独特城市(总共观察100个),而我希望从1:35开始的列与分配的集群(我们添加的新列K均值) . 这是我已经得到的,我完全被难倒了 .
f <- function(listOfCities, df){
# Returns a list of sorted years and clusters for each year of each city
yearsVect <- NULL
clusterVect <- NULL
for(i in 1:length(listOfCities)){
obs <- df[which(df$city == listOfCities[i]),c("year","cluster")]
obs <- obs[with(obs, order(year,cluster)), ]
print(obs)
}
}
f(top50largest, df_sorted_asc)
它输出了大量的data.frame对象,每个都是以下形状,这对我想要的东西很贴心:
我不确定如何将它们融合在一起多年(填补缺少NA的地方缺少年份)和之后的集群分配 . 所以我的希望是数据框看起来像这样(如果年份不存在,其中一些行值为NA:
带数据的简明示例
如果单击"test.csv",示例数据here
df<-read.csv("test.csv",header=TRUE)
head(df)
city state year cluster
257080 TAVISTOCK 29 31 2
267183 TAVISTOCK 29 32 3
277426 TAVISTOCK 29 33 3
287573 TAVISTOCK 29 34 2
297649 TAVISTOCK 29 35 2
252894 LAKESIDE 5 31 3
262987 LAKESIDE 5 32 5
273201 LAKESIDE 5 33 5
...
我想找到一种方法使这个数组具有独特的城市作为行名称,然后列是由群集填充的年份(从1:35),如果缺少年份,则只填充NA .