2017-07-30 9 views
0

これまでのquestionを複雑にすると、次のような靴下のデータがあります。条件付きで集計された集計dplyr

>socks 
year drawer week sock_total 
1990 1  1  3      
1990 1  2  4 
1990 1  3  3 
1990 1  4  2 
1990 1  5  4 
1990 2  1  1   
1990 2  2  1 
1990 2  3  1 
1990 2  4  1 
1990 2  5  2 
1990 3  1  3 
1990 3  2  4 
1990 3  3  4 
1990 3  4  4 
1990 3  5  4 
1991 1  1  4 
1991 1  2  3 
1991 1  3  2 
1991 1  4  2 
1991 1  5  3 
1991 2  1  1   
1991 2  2  3 
1991 2  3  4 
1991 2  4  4 
1991 2  5  3 
1991 3  1  2   
1991 3  2  3 
1991 3  3  3 
1991 3  4  2 
1991 3  5  3 

どのように私は最初の年の間、毎週の増加と他の二year-- 0が彼らだった場合1に等しいgrowth 新しい変数を作成するにはdplyrsummariseを使用することができます。データはまた、この

>socks 
drawer week growth 
    1  1  1   
    1  2  0 
    1  3  0 
    1  4  0 
    1  5  0 
    2  1  0   
    2  2  1 
    2  3  1 
    2  4  1 
    2  5  1 
    3  1  0 
    3  2  0 
    3  3  0 
    3  4  0 
    3  5  0 

ようになるはずです、どのように引き出しが年の1に対応する週間持っていなかったデータを処理します。 1週間が欠落している場合は、NAを追加してください。

+2

'靴下%>%アレンジ(年)%>%GROUP_BY(引き出し、週)%>%集計(成長= ifelse(差分(sock_total)> 0、1、0))' – eipi10

+2

行の場合( 'sock_total'はこれらの追加された行に対して' NA'で塗りつぶされます)、または 'tyyr'で' complete'を指定して追加することができます'fill'引数を使ってゼロにします):' library(tidyr); (%)%%% %>% %% group_by(引き出し、週)%>% 要約(growth = ifelse(diff(sock_total)> 0) ) ' – eipi10

+0

@ eipi10類似した構造を持つデータでは、' Summaryise_impl(.data、dots)でエラーが発生しました:列 "growth"は長さ1(要約値)でなければなりません。なぜこれが事実だろうか?私はあなたの最初のソリューションを使用しました。 – Alex

答えて

1

答えは前のものと非常に似ていますが、グループはdrawerweekで、@ eipi10のコメントも素晴らしいオプションです。例えば

:あなたはNAに長さゼロのオブジェクトをオンsubset後にインデックスを使用して、特定のdrawerweekのための不足している年を扱うことができる

df %>% 
    group_by(drawer, week) %>% 
    summarise(growth = +(sock_total[year==1991][1] - sock_total[year==1990][1] > 0)) 
#            ^^^       ^^^ 
# A tibble: 15 x 3 
# Groups: drawer [?] 
# drawer week growth 
# <int> <int> <int> 
# 1  1  1  1 
# 2  1  2  0 
# 3  1  3  0 
# 4  1  4  0 
# 5  1  5  0 
# 6  2  1  0 
# 7  2  2  1 
# 8  2  3  1 
# 9  2  4  1 
#10  2  5  1 
#11  3  1  0 
#12  3  2  0 
#13  3  3  0 
#14  3  4  0 
#15  3  5  NA 

データがために1991年を残しています引き出し3と5:

structure(list(year = c(1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 
1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 
1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 
1991L, 1991L, 1991L, 1991L, 1991L), drawer = c(1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), week = c(1L, 2L, 3L, 4L, 
5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 
1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L), sock_total = c(3L, 4L, 3L, 
2L, 4L, 1L, 1L, 1L, 1L, 2L, 3L, 4L, 4L, 4L, 4L, 4L, 3L, 2L, 2L, 
3L, 1L, 3L, 4L, 4L, 3L, 2L, 3L, 3L, 2L)), .Names = c("year", 
"drawer", "week", "sock_total"), class = "data.frame", row.names = c(NA, 
-29L)) 
1

completeを使わずに試すことができます。

df%>%group_by(drawer,week)%>% 
    summarise(growth =ifelse(n()<=1,0,ifelse((sock_total[1]-sock_total[2])>=0,0,1))) 



# A tibble: 15 x 3 
# Groups: drawer [?] 
    drawer week growth 
    <int> <int> <dbl> 
1  1  1  1 
2  1  2  0 
3  1  3  0 
4  1  4  0 
5  1  5  0 
6  2  1  0 
7  2  2  1 
8  2  3  1 
9  2  4  1 
10  2  5  1 
11  3  1  0 
12  3  2  0 
13  3  3  0 
14  3  4  0 
15  3  5  0