【问题标题】:Extra column based on paired data (mutate)基于配对数据的额外列(变异)
【发布时间】:2015-08-21 09:09:37
【问题描述】:

我有一个包含配对数据的数据集(同一家庭的成员)。

Id 是个人标识符,householdid 是合作伙伴的标识符(反之亦然)。

我需要为他\她的伴侣的每个id添加一个额外的列(职业)。

我的数据是这样的

dta = rbind( c(1013661,101366, 'Never worked'), 
   c(1013662, 101366, 'Intermediate occs'), 
   c(1037552, 103755, 'Managerial & professional occs'), 
   c(1037551, 103755, 'Intermediate occs')
)

colnames(dta) = c('idno', 'householdid', 'occup')
dta

 idno      householdid occup                           
"1013661" "101366"    "Never worked"                  
"1013662" "101366"    "Intermediate occs"             
"1037552" "103755"    "Managerial & professional occs"
"1037551" "103755"    "Intermediate occs"

我需要的应该是这样的

 idno      householdid occup                            occupPartner                    
"1013661" "101366"    "Never worked"                   "Intermediate occs"             
"1013662" "101366"    "Intermediate occs"              "Never worked"                  
"1037552" "103755"    "Managerial & professional occs" "Intermediate occs"             
"1037551" "103755"    "Intermediate occs"              "Managerial & professional occs"

我想有一个 mutate 的解决方案,但我不确定 group_by 应该是什么。

有什么想法吗?

【问题讨论】:

    标签: r merge dplyr


    【解决方案1】:

    试试

    library(dplyr)
    dta1 <-  as.data.frame(dta) %>% 
              group_by(householdid) %>% 
              mutate(occupPartner= rev(occup)) 
    as.data.frame(dta1)
    #     idno householdid                          occup
    #1 1013661      101366                   Never worked
    #2 1013662      101366              Intermediate occs
    #3 1037552      103755 Managerial & professional occs
    #4 1037551      103755              Intermediate occs
    #                 occupPartner
    #1              Intermediate occs
    #2                   Never worked
    #3              Intermediate occs
    #4 Managerial & professional occs
    

    如果数据已经排序,

     indx <- c(rbind(seq(2, nrow(dta), by=2), seq(1, nrow(dta), by=2)))
     cbind(dta, occupPartner=dta[,3][indx])
    

    【讨论】:

    • 辉煌辉煌辉煌
    【解决方案2】:

    另一个使用data.table的选项

    library(data.table)
    out = as.data.table(dta)[, occupPartner := rev(occup), by = householdid]
    
    #> out
    #      idno householdid                          occup
    #1: 1013661      101366                   Never worked
    #2: 1013662      101366              Intermediate occs
    #3: 1037552      103755 Managerial & professional occs
    #4: 1037551      103755              Intermediate occs
    #                     occupPartner
    #1:              Intermediate occs
    #2:                   Never worked
    #3:              Intermediate occs
    #4: Managerial & professional occs
    

    【讨论】:

    • 如果您想使用data.tables,那么使用setDT() 比使用as.data.table() 不必要地复制数据更好。
    • 其实我用的是as.data.table(),因为输入数据是一个矩阵。
    • 但肯定 setDTdata.table 中更好的选择,因为它是一个数据框,感谢 Arun!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2020-06-27
    • 2023-01-07
    相关资源
    最近更新 更多