基于互变量将观察结果组合成一个新变量

Combining observations into a new variable based on a mutual variable

我合并了来自同一调查的两个数据集。一种是个人层面 selectedindividual,一种是家庭层面 selectedhousehold。我使用以下代码合并了两个数据集(使用 dplyr 中的 left_join):

mergeddf <- left_join(selectedhousehold, selectedindividual)  %>% group_by(shserial)  %>% slice (1)

shserial 变量是两个数据集中存在的主键。每个家庭都有一个特定的号码。每个家庭最多可以包含两个人,因此他们将拥有相同的shserial。因为我想在家庭层面进行分析,所以我不想只在数据集上使用 merge()(因为这重复了有 2 个人的家庭的观察结果,例如,我的因变量之一家庭层面 - GrossIncome)。

不过我还有一个问题:

我有一个个人级别的变量,WrkStat(具有三个级别,workingNWorkFTEduc),我想将其包含在我的模型中.我用于合并数据集的代码只保留了两个具有相同数字的 shserial 的第一个观察结果(我假设,至少,我无法弄清楚 slice() 是如何工作的)。这不利于我的分析,因为我不想 select 随机选择一个家庭中的两个人之一。为了说明,WrkStat 在非合并和合并数据帧中的摘要统计信息:

> summary(selectedindividual$WrkStat)
working  FTEduc   NWork    NA's 
    324     748    2455     201 

> summary(mergeddf$WrkStat)
working  FTEduc   NWork    NA's 
    251      77    2097       5 

作为解决方案,我想我会创建一个新变量 WrkStat2,它结合了一个家庭中两个人的观察结果。我想在 before 合并数据集之前创建这个变量。

我希望我可以根据相互 shserial 号码创建这个新变量。 但是,我不知道该怎么做。

编辑:

我的数据框的结构:

selectedindividual <- structure(list(`shserial` = c(1010574, 1010574, 
1011104, 1011104, 1011109, 1011109, 1011134, 1011134, 1011142, 
1011143, 1011148, 1011148, 1011154, 1011154, 1011156, 1011171, 
1011171, 1011174, 1011174, 1011182), `WrkStat` = structure(c(3L, 
2L, 3L, 2L, 3L, NA, 1L, NA, 3L, 3L, 3L, 2L, 3L, 2L, 3L, 1L, 2L, 
3L, NA, 3L), .Label = c("working", "FTEduc", "NWork"), class = "factor")), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

给出这个输出:

   shserial WrkStat
      <dbl> <fct>  
 1  1010574 NWork  
 2  1010574 FTEduc 
 3  1011104 NWork  
 4  1011104 FTEduc 
 5  1011109 NWork  
 6  1011109 NA     
 7  1011134 working
 8  1011134 NA     
 9  1011142 NWork  
10  1011143 NWork  
11  1011148 NWork  
12  1011148 FTEduc 
13  1011154 NWork  
14  1011154 FTEduc 
15  1011156 NWork  
16  1011171 working
17  1011171 FTEduc 
18  1011174 NWork 

我想要这个输出:

   shserial WrkStat2
      <dbl> <fct>  
 1  1010574 NWork/FTEduc  
 2  1011104 NWork/FTEduc 
 3  1011109 NWork     
 4  1011134 working
 5  1011142 NWork  
 6  1011143 NWork  
 7  1011148 NWork/FTEduc
 8  1011154 NWork/FTEduc 
 9  1011156 NWork  
10  1011171 working/FTEduc
11  1011174 NWork 

(这也删除了不属于它自己的 NA(因此不是组合的 WrkStat),尽管我认为如果在此过程中删除所有 NA 也很好)。

另一个编辑:

WrkStat2 应具有以下标签:

"working/working",
"working/NWork",
"working/FTEduc",
"NWork/NWork",
"NWork/FTEduc",
"FTEduc/FTEduc",
"working",
"NWork",
"FTEduc"

如果有什么不清楚或者不可能完成所有事情,我很抱歉(让我知道)。我不擅长逻辑思考,并且为此苦苦挣扎了几天。

我们可以删除 NA 个值和每个 shserialpaste WrkStat

这可以在 base R 中完成:

aggregate(WrkStat~shserial, selectedindividual, function(x) 
           paste0(na.omit(x), collapse = "/"))

#   shserial        WrkStat
#1   1010574   NWork/FTEduc
#2   1011104   NWork/FTEduc
#3   1011109          NWork
#4   1011134        working
#5   1011142          NWork
#6   1011143          NWork
#7   1011148   NWork/FTEduc
#8   1011154   NWork/FTEduc
#9   1011156          NWork
#10  1011171 working/FTEduc
#11  1011174          NWork
#12  1011182          NWork

dplyr :

library(dplyr)
selectedindividual %>% 
   group_by(shserial) %>% 
   summarise(WrkStat2 = paste0(na.omit(WrkStat), collapse = "/"))

或在 data.table 中:

library(data.table)
setDT(selectedindividual)[, (WrkStat = paste0(na.omit(WrkStat), collapse = "/")), 
                            shserial]