2017-01-20 1 views
-1

Je veux calculer le pourcentage d'une trame de données qui est commepourcentage Calculer d'un deux colonnes

day hour place t1 t2 
___ ____ _____ __ ___ 
1 0  1  5 10 
1 0  2  6 12 
1 0  3  9 8 
1 1  1  6 12  
1 1  2  8 15 
1 1  3  10 18 
1 2  1  5 1 
1 2  2  6 12 
1 2  3  9 1 
1 3  1  8 10 
1 3  2  8 2 
1 3  3  9 8 
2 0  1  5 1 
2 0  2  6 12 
2 0  3  9 8 
2 1  1  9 10 
2 1  2  6 12 
2 1  3  9 8 
2 2  1  5 10 
2 2  2  6 12 
2 2  3  9 18 
2 3  1  5 0 
2 3  2  6 2 
2 3  3  9 18 

Je veux calculer plus deux colonnes qui calculera le pourcentage de t1 et t2 par heure par exemple, je veux

day hour place t1 t2 t1%  t2% 
___ ____ _____ __ ___ ___  ___ 
1 0  1  5 10 (5/20) (10/30) 
1 0  2  6 12 (6/20) (12/30) 
1 0  3  9 18 (9/20) (18/30) 
1 1  1  6 12 (12/24) (12/45) 
1 1  2  8 15 (15/24) (15/45) 
1 1  3  10 18 (18/24) (18/45) 

Cela signifie que le t1 divisé par la somme de t1 pour le jour et l'heure de chaque places.I savent prendre somme pour la colonne entière, mais je veux prendre somme pour chaque heure et le jour. Toute aide est appréciée.

Répondre

3

Vous pouvez simplement faire:

library(tidyverse) 
df%>% 
    group_by(day,hour)%>% 
    mutate("t1%"=t1/sum(t1),"t2%"=t2/sum(t2)) 

Vous devez utiliser group_by() pendant des jours et des heures pour que quelques heures seulement d'un seul jour sont regroupés.

+0

Je pense que vous avez une faute de frappe avec 't1/sum (t2)' – akrun

+1

Je le fais, merci. – Haboryme

1

Voici une option similaire utilisant la syntaxe data.table. Convertissez le 'data.frame' en 'data.table', groupé par 'jour', 'heure', spécifiez les colonnes d'intérêt dans .SDcol, bouclez celles-ci (lapply(..), faites le calcul et affectez-le (:=) à créer de nouvelles colonnes

library(data.table) 
setDT(df)[, paste0(names(df)[4:5], "_perc") := 
    lapply(.SD, function(x) x/sum(x)), .(day, hour), .SDcols = t1:t2] 
2

Nous pouvons utiliser l'option de base R de ave et de les regrouper par day et hour

df$t1perc <- ave(df$t1, df$day, df$hour, FUN = function(x) x/sum(x)) 
df$t2perc <- ave(df$t2, df$day, df$hour, FUN = function(x) x/sum(x)) 
2

Voici une option de base de R à l'aide ave et prop.table,

data.frame(df, sapply(df[, c("t1","t2")], function(i) 
              ave(i, df$day, df$hour, FUN = prop.table)))