我已经筛选了几个链接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:
示例数据here如果您点击&#34; test.csv&#34;
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。 / p>