2017-01-27 2 views
0

Я новичок в R и у меня есть кадр данных, который содержит следующие поля:Как рассчитать процент в R?

day place hour time_spent count 
1  1  1  1   120 
1  1  1  2   100 
1  1  1  3   90 
1  1  1  4   80 

Так что моя цель состоит, чтобы вычислить время, проведенное в каждом месте, где 75% транспортных средств, чтобы пересечь место. Так что с этого кадра данных я произвожу ниже кадр данных по

day place hour time_spent count cum_count percentage 
    1  1  1  1   120  120  30.7% 
    1  1  1  2   100  220  56.4% 
    1  1  1  3   90  310  79% 
    1  1  1  4   80  390  100% 

df$cum_count=cumsum(df$count) 
df$percentage=cumsum(df$percentage) 

for(i in 1:length(df$percentage)){ 

     if(df$percentage[i]>75%){ 
      low time=df$time_spent[i-1] 
      high_time=df$time_spent[i] 
      } 
     } 

Так что означает, что 75% транспортных средств проводят 2-3 минуты на месте 1.But теперь у меня есть кадр данных, как это, которое для все места и на все дни.

day place hour time_spent count 
1  1  1  1   120 
1  1  1  2   100 
1  1  1  3   90 
1  1  1  4   80 
1  2  1  1   220 
1  2  1  2   100 
1  2  1  3   90 
1  2  1  4   80 
1  3  1  1   100 
1  3  1  2   80 
1  3  1  3   90 
1  3  1  4   100 
2  1  1  1   120 
2  1  1  2   100 
2  1  1  3   90 
2  1  1  4   80 
2  2  1  1   220 
2  2  1  2   100 
2  2  1  3   90 
2  2  1  4   80 
2  3  1  1   100 
2  3  1  2   80 
2  3  1  3   90 
2  3  1  4   100 

Как можно рассчитать время и время для каждого места? Любая помощь приветствуется.

ответ

1

В max и min функции должны сделать трюк здесь. Хотя вы также можете сделать summary, чтобы получить средний, средний и т. Д. За один раз. Я бы также рекомендовал функцию quantile для этих процентов. Как обычно, случай с R является сложной частью при получении данных в правильном формате.

Допустим, вы хотите, общее время, проведенное на каждом месте:

index <- sort(unique(df$place)) 
times <- as.list(rep(NA, length(index))) 
names(times) <- index 
for(ii in index){ 
    counter <- c() 
    for(jj in df[df$place==ii,]$time_spent){ 
    counter <- c(counter, rep(jj, df[df$place==ii,]$count[jj])) 
    } 
    times[[ii]] <- counter 
} 

Теперь для каждого места можно вычислить максимум и минимум с:

lapply(times, max) 
lapply(times, min) 

Аналогично можно вычислить среднее:

lapply(times, function(x) sum(x)/length(x)) 
lapply(times, mean) 

Я думаю, что вы хотите получить квантили:

Это было бы время, по которому прошло не менее 75% транспортных средств, хотя место, то есть 75% транспортных средств, заняло это время или меньше, чтобы пройти.

+0

В Уре код 'имена (раз) <- index' выдает ошибку, поскольку атрибут имен [87] должен быть такой же длины, как и вектор [2]. Почему это так? –

+0

Думаю, я исправил, как назначается «время». :) –

+0

Нет, все равно такая же ошибка :( –

0

Мы можем использовать группу по работе

library(dplyr) 
dfN %>% 
    group_by(day, place) %>% 
    mutate(cum_count = cumsum(count), 
      percentage = 100*cum_count/sum(count), 
      low_time = time_spent[which.max(percentage > 75)-1], 
      high_time = time_spent[low_time+1]) 
0

, если я правильно понял ваш вопрос (вы хотите минимальное и максимальное значение time_spent в месте):

df %>% 
    group_by(place) %>% 
    summarise(min(time_spent), 
      max(time_spent)) 

даст вам это:

place min(time-spent) max(time_spent) 

1  1      4 

2  1      4 

3  1      4 
Смежные вопросы