2017-05-13 10 views
0

私は日によって注文されたレストラン検査のデータフレームを持っています。観察ごとに2つの変数を追加して、このレストランに何回検査をしたか、また何回失敗したかを記録します。私はforループの使用を避けたいと思いますが、これをどうやって行うべきかわかりません。基本的に、私は現在、下のデータフレームの最初の3つの列からなるデータフレームを持っており、最後の2つの列を追加したいと考えています。R以前の出現に基づいて変数を増やす

初期データフレーム

Restaurant_ID Date   Result 
    1    01/02/2011 Pass 
    2    02/05/2011 Pass 
    3    04/07/2011 Fail 
    1    09/05/2011 Fail 
    2    03/13/2012 Pass 
    1    08/25/2012 Fail 
    2    09/25/2012 Pass 
    3    01/05/2013 Pass 

所望の出力1

Restaurant_ID Date   Result total_inspect failed_inspect 
1    01/02/2011 Pass  1    0 
2    02/05/2011 Pass  1    0 
3    04/07/2011 Fail  1    1 
1    09/05/2011 Fail  2    1 
2    03/13/2012 Pass  2    0 
1    08/25/2012 Fail  3    2 
2    09/25/2012 Pass  3    0 
3    01/05/2013 Pass  2    1 

編集:私は、私が実際に最後の2つの列が全体の数を反映したいと前に点検を失敗したことを実現しました現在の観測。だから私は実際に何をしたい

所望の出力2

Restaurant_ID Date   Result past_inspect past_failed_inspect 
    1    01/02/2011 Pass  0    0 
    2    02/05/2011 Pass  0    0 
    3    04/07/2011 Fail  0    0 
    1    09/05/2011 Fail  1    0 
    2    03/13/2012 Pass  1    0 
    1    08/25/2012 Fail  2    1 
    2    09/25/2012 Pass  2    0 
    3    01/05/2013 Pass  1    1 

答えて

3

このソリューションは、パッケージtidyverselubridateから関数を使用しています。

# Create the example data frame 
dt1 <- read.csv(text = "Restaurant_ID,Date,Result 
1,01/02/2011,Pass 
2,02/05/2011,Pass 
3,04/07/2011,Fail 
1,09/05/2011,Fail 
2,03/13/2012,Pass 
1,08/25/2012,Fail 
2,09/25/2012,Pass 
       3,01/05/2013,Pass", 
       stringsAsFactors = FALSE) 

# Load packages 
library(tidyverse) 
library(lubridate) 

dt2 <- dt1 %>% 
    # Convert the Date column to Date class 
    mutate(Date = mdy(Date)) %>% 
    # Sort the data frame based on Restaurant_ID and Date 
    arrange(Restaurant_ID, Date) %>% 
    # group the data by each restaurant ID 
    group_by(Restaurant_ID) %>% 
    # Create a column showing total_inspect 
    mutate(total_inspect = 1:n()) %>% 
    # Create a column showing fail_result, fail is 1, pass is 0 
    mutate(fail_result = ifelse(Result == "Fail", 1, 0)) %>% 
    # Calculate the cumulative sum of fail_result 
    mutate(failed_inspect = cumsum(fail_result)) %>% 
    # Remove fail_result 
    select(-fail_result) %>% 
    # Sort the data frame by Date 
    arrange(Date) 

編集:

dt3 <- dt2 %>% 
    mutate(past_inspect = ifelse(total_inspect == 0, 0, total_inspect - 1)) %>% 
    mutate(past_failed_inspect = ifelse(Result == "Fail" & failed_inspect != 0, 
             failed_inspect - 1, 
             failed_inspect)) %>% 
    select(-total_inspect, -failed_inspect) 
+0

が、これは素晴らしいですありがとう数える過去の検査を計算し、失敗!私はあなたがその方向に私を指摘していただきありがとうございます前に、整頓パッケージについて知りませんでした。私が追加したばかりの編集で私を助けてくれることを願っていました。私は、現在の観測に先立って検査を反映するために検査の合計と失敗を望みます。最初は、両方の列から1を減算することができたと思っていましたが、failed_inspectとpast_failed_inspectがレストラン3と同じ最後の行に見られるように、past_failed_inspectでは機能しません。 – person10559

+1

@ person10559私の更新を見てください。 'dt3'は' Desired output 2'です。 – www

+0

これは非常に有益です、ありがとうございました! – person10559

関連する問題