我在sparkR中有一个DataFrame data
。它包含user = 12 311 12 320, ...
和type = 1 2 3 4
。我们有10000个用户。
例如,一个用户的类型= 1 2 3 4 4 4 2 4。 我想为这个用户找到类型中最常见的整数。在R我可以这样解决
mostcommon <- which.max(tabulate(user$type))
鉴于&#39;用户&#39;是一个data.frame而不是DataFrame。 我希望为数据中的所有用户执行此操作。一种方法是这样做
u<- c()
for(j in 1:10000) {
id <- filter(data, data$user== j)
# For the jth user I make the data local to run the
# which.max and tabulate functions
idlocal <- collect(id)
u[j] <- which.max(tabulate(idlocal$type))
}
这在R / sparkR中运行,u为我提供了所有用户最常用的类型。但这需要时间,因为我使用本地数据来运行which.max和制表函数。有更智能,更快捷的方法吗?
另外,如何才能找到两种最常见的类型?
答案 0 :(得分:3)
也许不是最好的解决方案,但它有效:
创建示例数据
localData <- data.frame(user = c(1,1,1,2,2,2),
type = c(1,2,2,3,3,2))
data <- createDataFrame(sqlContext, localData)
按用户分组并键入和计算它出现的次数(表格类型)
groupedData <- groupBy(data, data$user, data$type)
aggregated <- agg(groupedData, number = n(data$user))
对此计数的数字进行排序,因为这是查找具有最大出现次数的类型的最简单方法。
arranged <- arrange(aggregated, desc(aggregated$number))
再次对用户进行分组并采取第一次出现的类型,这是我们订购后的最大值。
regroupedData <- groupBy(arranged, arranged$user)
firstItems <- agg(regroupedData, firstType = first(arranged$type), number = first(arranged$number))
查看结果
collect(firstItems)
如果你现在也想要第二个最多的项目,你可以先删除这些第一项
firstDeleted <- except(arranged,firstItems)
再次应用相同的方法
rearranged <- arrange(firstDeleted, desc(firstDeleted$number))
reregroupedData <- groupBy(rearranged, rearranged$user)
secondItems <- agg(reregroupedData, secondType = first(rearranged$type))
删除非必要列并重命名列 firstItems $ number&lt; - NULL secondItems&lt; - withColumnRenamed(secondItems,&#34; user&#34;,&#34; user2&#34;)
要获得最终结果,请加入这些DataFrames(zh_cn删除列user2)
result <- join(firstItems,secondItems, firstItems$user == secondItems$user2)
result$user2 <- NULL
再次检查这些结果
collect(result)