1

我在 sparkRdata中有一个 DataFrame。它包含user = 12 311 12 320, ...type = 1 2 3 4。我们有 10000 个用户。

例如,一个用户的 type = 1 2 3 4 4 4 2 4。我想为这个用户找到 type 中最常见的整数。在 RI 中可以这样解决

mostcommon <- which.max(tabulate(user$type))

鉴于“用户”是一个 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 中运行,你为我提供了所有用户最常见的类型。但这需要时间,因为我将数据本地化以运行 which.max 和制表函数。有没有更聪明、更快捷的方法来做到这一点?

此外,如何同时找到两种最常见的类型?

4

1 回答 1

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 <- NULL secondItems <- withColumnRenamed(secondItems, "user", "user2")

对于最终结果,加入这些 DataFrame(删除列 user2)

result <- join(firstItems,secondItems, firstItems$user == secondItems$user2)

result$user2 <- NULL

再次检查这些结果

collect(result)
于 2015-09-01T10:34:22.020 回答