在SparkR中,我有一个DataFrame data
包含id
,amount_spent
和amount_won
。
例如,对于id = 1,我们有
head(filter(data, data$id==1))
,输出
1 30 10
1 40 100
1 22 80
1 14 2
到目前为止,我想知道固定ID是否胜过亏损。金额可以忽略。
在R中我可以让它运行但需要时间。假设我们有100个身份证。在R我做了这个
w=c()
for(j in 1:100){
# Making it local for a fixed id
q=collect(filter(data, data$id==j))
# Checking the difference. 1 means wins and 0 means losses
if( as.numeric(q$amount_won) - as.numeric(q$amount_spent)>0 {
w[j]=1
}
else{w[j]=0}
}
现在简单地给我1和0以及所有id。在sparkR中,我想以更快的方式做到这一点。
答案 0 :(得分:1)
我不确定这是否是您想要的,所以请随时要求调整。
df <- data.frame(id = c(1,1,1,1),
amount_spent = c(30,40,22,14),
amount_won = c(10,100,80,2))
DF <- createDataFrame(sqlContext, df)
DF <- withColumn(DF, "won", DF$amount_won > DF$amount_spent)
DF$won <- cast(DF$won, "integer")
grouped <- groupBy(DF, DF$id)
aggregated <- agg(grouped, total_won = sum(DF$won), total_games = n(DF$won))
result <- withColumn(aggregated, "percentage_won" , aggregated$total_won/aggregated$total_games)
collect(result)
我在DF中添加了一个列,无论ID是否赢得了比他在该行上花费的更多。结果输出了有人玩的游戏数量,他赢得的游戏数量以及他赢得的游戏比例。