2017-12-24 8 views
2

私は、「世帯数」、「世帯主」、「教育」、「収入」の変数を持つカップルのデータを持っています。 「世帯数」は、各世帯に一意的に割り当てられるID番号です。 (1 =世帯主、2 =世帯主の配偶者)、「教育」と「所得」はそれぞれの教育水準と所得である。たとえば、データは以下のようになります。配偶者変数を作成するには?

'household_number' 'head_of_household' 'education' 'income' 
     1      1    high  1000 
     1      2    low  100 
     3      1    medium  500 
     3      2    high  800 
     4      2    high  800 
     4      1    high  800 
     9      1    low  150 
     9      2    low  200 

個人ごとに配偶者の変数を作成したいと考えています。そのデータは以下のようになります。 「配偶者エデュー」は配偶者の教育水準で、「配偶者」は配偶者の所得です。

'household_number' 'head_of_household' 'education' 'income' 'spouse_edu' 'spouse_inc' 
     1      1    high  1000  low   100 
     1      2    low  100  high  1000 
     3      1    medium  500  high  800 
     3      2    high  800  medium  500 
     4      2    high  800  high  800 
     4      1    high  800  high  800 
     9      1    low  150  low   200 
     9      2    low  200  low   150 

私は非常に大きなデータセットを持っていますので、私はこれを行う簡単な方法を探しています。これを行うためのエレガントな方法はありますか?

以下は再現可能な構文の例です。

household_number <- c(1,1,3,3,4,4,9,9) 
head_of_household <- c(1,2,1,2,2,1,1,2) 
education <- c("high", "low", "medium", "high", "high", "high", "low", "low") 
income <- c(1000, 100, 500, 800, 800, 800, 150, 200) 

data <- data.frame(household_number, head_of_household, education, income) 
+0

'data.table'がお手伝いします。 – MKR

答えて

6

ここでbase::revdplyrを使用できます。

library(dplyr) 
data %>% 
group_by(household_number) %>% 
mutate(spouse_income = rev(income), 
     spouse_education = rev(education)) %>% 
ungroup() 

# A tibble: 8 x 6 
    household_number head_of_household education income spouse_income spouse_education 
      <dbl>    <dbl> <fctr> <dbl>   <dbl>   <fctr> 
1    1     1  high 1000   100    low 
2    1     2  low 100   1000    high 
3    3     1 medium 500   800    high 
4    3     2  high 800   500   medium 
5    4     2  high 800   800    high 
6    4     1  high 800   800    high 
7    9     1  low 150   200    low 
8    9     2  low 200   150    low 

data.tableを使用したソリューション。

library(data.table) 
data_DT <- as.data.table(data) 
data_DT[ , c("spouse_income", "spouse_education") := list(rev(income), rev(education)), by = household_number] 
data_DT 

    household_number head_of_household education income spouse_income spouse_education 
1:    1     1  high 1000   100    low 
2:    1     2  low 100   1000    high 
3:    3     1 medium 500   800    high 
4:    3     2  high 800   500   medium 
5:    4     2  high 800   800    high 
6:    4     1  high 800   800    high 
7:    9     1  low 150   200    low 
8:    9     2  low 200   150    low 
+0

OPが望んでいた行を 'switch'するのは本当に素晴らしい解決策です。 'group_by()%>%mutate()'は巧妙です – InfiniteFlashChess

1

data.tableshiftを使用してこの問題を解決するための他の方法。それは2ステップのプロセスになります。

household_numberにすることによって最初のグループとlag

data[,':='(
     spouse_edu = shift(education), 
     spouse_inc = shift(income)), 
     by = household_number] 
> data 
    household_number head_of_household education income spouse_edu spouse_inc 
1:    1     1  high 1000   NA   NA 
2:    1     2  low 100  high  1000 
3:    3     1 medium 500   NA   NA 
4:    3     2  high 800  medium  500 
5:    4     2  high 800   NA   NA 
6:    4     1  high 800  high  800 
7:    9     1  low 150   NA   NA 
8:    9     2  low 200  low  150 

shiftを使用して第一セットの配偶者の詳細を記入し、shiftleadタイプを使用して、他のセットのために配偶者の詳細を記入してください。既に記入または更新された配偶者の詳細を交換しないようにしてください。

data[,':='(
     spouse_edu = ifelse(is.na(spouse_edu), shift(education, type="lead"), spouse_edu) , 
     spouse_inc = ifelse(is.na(spouse_inc), shift(income, type="lead"), spouse_inc)), 
     by = household_number] 
> data 
    household_number head_of_household education income spouse_edu spouse_inc 
1:    1     1  high 1000  low  100 
2:    1     2  low 100  high  1000 
3:    3     1 medium 500  high  800 
4:    3     2  high 800  medium  500 
5:    4     2  high 800  high  800 
6:    4     1  high 800  high  800 
7:    9     1  low 150  low  200 
8:    9     2  low 200  low  150 
関連する問題