【问题标题】:How to create spouse variable?如何创建配偶变量?
【发布时间】:2018-06-17 16:01:08
【问题描述】:

我有一对夫妇的数据,变量:“户口”、“户主”、“教育”、“收入”。 “户号”是唯一分配给每个家庭的身份证号码。 “户主”是指该人是否为户主(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)

【问题讨论】:

  • 结婚很容易:git wife

标签: r merge


【解决方案1】:

您可以在此处使用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)
setDT(data)[, c("spouse_income", "spouse_education") := .(rev(income), rev(education)),
            by = household_number][]

# same as
# setDT(data)[, `:=`(spouse_income = rev(income), 
#                    spouse_education = rev(education)),
#             by = household_number][]

base R 中可以做到

transform(data, 
          spouse_income = ave(income, household_number, FUN = rev),
          spouse_education = ave(education, household_number, FUN = rev)) 

【讨论】:

  • switch 行的非常好的解决方案,这正是 OP 想要的。 group_by() %&gt;% mutate() 很聪明
【解决方案2】:

data.table 中使用shift 解决此问题的另一种方法。不过,这将是两步过程。

第一组按household_number 并使用shift 填写第一组的配偶详细信息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

现在,使用lead 类型的shift 填写其他组的配偶详细信息。确保我们不会替换已填写或更新的配偶详细信息。

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多