我已经筛选了几个链接1234,仅举几例,但我似乎无法正确解决我的具体问题 .

问题

我有以下数据框:

df <- read.csv("crime_data", header=TRUE)
head(df)

enter image description here

我在数据上应用了K-means,并添加了一个额外的列 cluster ,所以现在我想将它们分类为人口最多的前50个城市和人口最少的前50个城市,这给了我以下内容:

df_sorted_asc <- df[with(df, order(population, city)), ]
head(df_sorted_asc)

enter image description here

工作得很好......现在我的城市按升序排序,但这里是我遇到麻烦的地方,年份数从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对象,每个都是以下形状,这对我想要的东西很贴心:

enter image description here

我不确定如何将它们融合在一起多年(填补缺少NA的地方缺少年份)和之后的集群分配 . 所以我的希望是数据框看起来像这样(如果年份不存在,其中一些行值为NA:

enter image description here

带数据的简明示例

如果单击"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 .