2017-07-28 40 views
3

可以說我有每個抽屜條件和分組發生變異dplyr

>socks 
year drawer_nbr sock_total 
1990 1   2 
1991 1   2 
1990 2   3 
1991 2   4 
1990 3   2 
1991 3   1 

我想有標識,如果襪子在每個抽屜都增加一個二元變量的襪子增加了以下數據。如果它們增加1,否則爲0。其結果將是

>socks 
drawer_nbr growth 
    <dbl>  <factor> 
    1   0 
    2   1 
    3   0 

我陷入比較上一年sock_total VS一年的sock_total。我知道我需要使用dplyr::summaries(),但是我對該功能中的內容有困難。

+1

您是否只使用兩年的數據? –

+0

@Alex P是的,最多隻有2年。 – Alex

+0

這裏是另一個選項'socks%>%arrange(drawer_nbr,year)%>%group_by(drawer_nbr)%>%summarize(growth = +(diff(sock_total)> 0))' – akrun

回答

4

如果您1991年比較1990年,你可以這樣做:

socks %>% 
    group_by(drawer_nbr) %>% 
    summarise(growth = +(sock_total[year == 1991] - sock_total[year == 1990] > 0)) 
# A tibble: 3 x 2 
# drawer_nbr growth 
#  <int> <int> 
#1   1  0 
#2   2  1 
#3   3  0 
+0

'+'是什麼? – Alex

+3

這是將布爾值轉換爲數值的簡稱,「TRUE」爲1,「FALSE」爲0. – Psidom

+1

您可以在'group_by'後面添加一個過濾器,以過濾出不具有兩年數據的組。 'socks%>%group_by(drawer_nbr)%>%filter(all(c(1990,1991)%in%year))%>%summarize(growth = +(sock_total [year == 1991] - sock_total [year == 1990]> 0))' – Psidom

1

你可以使用的dplyrtidyr混合:

library(tidyr) 
library(dplyr) 

socks %>% 
    group_by(drawer_nbr) %>% 
    spread(year, sock_total) %>% 
    mutate(growth = `1991` - `1990`) 

或者,如果你只是想成長爲二進制:

socks %>% 
    group_by(drawer_nbr) %>% 
    spread(year, sock_total) %>% 
    mutate(growth = ifelse((`1991` - `1990`) > 0, 
         1, 0))