2017-01-20 4 views
-1

я хочу, чтобы вычислить процент для кадра данных, который, какВычислить процент от двух колонок

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 

Я хочу, чтобы вычислить еще два столбца, который будет вычислить процент t1 и t2 по часам, например, я хочу

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) 

Это означает, что t1, деленный на сумме t1 на день и час каждого places.I знать, чтобы взять сумму для всего столбца, но я хочу взять сумму за каждый час и день. Любая помощь приветствуется.

ответ

3

Вы могли бы просто сделать:

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

Вы должны использовать group_by() в течение нескольких дней и часов, так что всего за несколько часов от одного дня группируются вместе.

+0

У меня есть опечатка с 't1/sum (t2)' – akrun

+1

Я делаю, спасибо. – Haboryme

1

Вот аналогичный вариант, используя синтаксис data.table. Преобразуйте «data.frame» в «data.table», сгруппированные по «день», «час», укажите интересующие столбцы в .SDcol, проведите по ним (lapply(..), выполните расчет и назначьте (:=) его создавать новые столбцы

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

Мы можем использовать опцию базовой R из ave и сгруппировать их по day и 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

Вот вариант базы R с помощью ave и prop.table,

data.frame(df, sapply(df[, c("t1","t2")], function(i) 
              ave(i, df$day, df$hour, FUN = prop.table))) 
Смежные вопросы