2017-12-24 1 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 

나는 개인마다 배우자의 변수를 만들고 싶습니다. 그래서 그 데이터는 아래와 같습니다. 여기서 '배우자 edu'는 배우자의 교육 수준이고 '배우자 inc'는 배우자의 소득입니다.

'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가 원했던 행을 '전환'하는 데 정말 좋은 솔루션입니다. '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를 사용하여 1 세트의 배우자 세부 사항을 기입 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 
관련 문제