Как вычесть элементы в DataFrame

В 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

Пока я хочу знать, выиграл ли фиксированный идентификатор больше, чем проиграл. Суммой можно пренебречь.

В R я могу заставить его работать, но это требует времени. Скажем, у нас есть 100 идентификаторов. В Р я сделал это

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}
}

Теперь w просто дает мне 1 и 0 для всех идентификаторов. В sparkR я хочу сделать это более быстрым способом.


person Ole Petersen    schedule 08.09.2015    source источник


Ответы (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 больше, чем он потратил на эту строку. В результате получается количество сыгранных игр, количество выигранных игр и процент выигранных игр.

person Wannes Rosiers    schedule 08.09.2015
comment
Да, это имеет смысл. Как подсчитать общее количество выигранных = FALSE и TRUE? - person Ole Petersen; 08.09.2015
comment
Подсчитывается общее количество игр, общее количество выигранных игр и процент выигранных игр. - person Wannes Rosiers; 08.09.2015