Объединение наблюдений в новую переменную, основанную на взаимной переменной - PullRequest
1 голос
/ 19 апреля 2020

Я объединил два набора данных из одного опроса. Один на индивидуальном уровне selectedindividual, а другой на уровне домохозяйства selectedhousehold. Я объединил два набора данных, используя следующий код (используя left_join из dplyr):

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

Переменная shserial является первичным ключом, присутствующим в обоих наборах данных. Каждое домохозяйство имеет определенный номер c. Каждое домохозяйство может содержать до двух человек, которые поэтому будут иметь одинаковые shserial. Поскольку я хочу провести свой анализ на уровне домохозяйства, я не хотел просто использовать merge() для наборов данных (поскольку это дублировало наблюдения в домохозяйствах с двумя индивидуумами, например, для одной из моих зависимых переменных в домохозяйстве уровень - GrossIncome).

У меня все еще есть проблема:

У меня есть переменная на индивидуальном уровне, WrkStat (с тремя уровнями, working, NWork, FTEduc), которую я хочу включить в мою модель. Код, который я использовал для объединения наборов данных, сохранил только первые наблюдения для двух shserials с одинаковым номером (я предполагаю, что, по крайней мере, я не мог понять, как работает slice() точно). Это не очень хорошо для моего анализа, так как я не хочу случайным образом выбирать одного из двух человек в семье. Чтобы проиллюстрировать сводную статистику 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, которая объединяет наблюдения для двух человек в одной семье. Я хочу создать эту переменную до слияния наборов данных.

Я надеялся, что смогу создать эту новую переменную на основе общего числа 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"

Извините, если что-то неясно или все невозможно (дайте мне знать ). Я не очень хорош в логическом мышлении и боролся с этим несколько дней.

1 Ответ

0 голосов
/ 19 апреля 2020

Мы можем удалить NA значения и paste WrkStat для каждого shserial.

Это можно сделать в базе 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...