R - создание переменной, которая записывает категориальную информацию о другом члене группы

У меня есть набор данных data семей, где каждое домохозяйство идентифицировано переменной id, и каждый человек идентифицирован с помощью id + num (идентификатор семьи + член семьи). Для каждого человека у меня есть разные демографические характеристики, например:

id  num  age  wage     edu            marital_status
1   1    33   1200    Secondary       Married/Cohabitating
1   2    35   1100    College         Married/Cohabitating
1   3    12   -1      Not applicable  Not applicable
2   1    27   1600    College         Single
3   1    59   2000    Secondary       Married/Cohabitating
3   2    51   1800    Other           Married/Cohabitating

       

Я создал набор переменных, которые фиксируют характеристики другого члена семьи. Так, например, я хотел иметь переменную для «заработной платы партнера» wage_p для домохозяйств с двумя взрослыми, состоящими в браке или сожительстве, которую я получил с помощью

sums = tapply(data$wage, data$id, sum)
data$wage_tot = sums[match(data$id,names(sums))]
data$wage_tot[!(data$id %in% data$id[duplicated(data$id)])] = NA
data$wage_p = data$wage_tot - data$wage

В основном, я суммировал wage на семью, получив wage_tot, а затем вычитал wage, чтобы получить wage_p.

Это сработало, потому что я сначала ограничил набор данных женатыми или сожительствующими лицами (так что у меня было 1 или 2 человека на семью). (Я знаю, что это, вероятно, более запутано, чем необходимо).

Мои результаты:

id  num  age  wage     edu            marital_status        wage_tot   wage_p
1   1    33   1200    Secondary       Married/Cohabitating   2300      1100
1   2    35   1100    College         Married/Cohabitating   2300      1200
2   1    27   1600    College         Single                 NA         NA
3   1    59   2000    Secondary       Married/Cohabitating   3800      1800
3   2    51   1800    Other           Married/Cohabitating   3800      2000  

Теперь проблема возникает, когда я хочу сделать это с категориальными переменными, потому что я не могу получить сумму, а затем вычесть, как я сделал с непрерывными переменными. Так, например, если я хочу создать переменную, которая фиксирует уровень образования супруга, edu_p.

id  num  age  wage     edu            marital_status         edu_p
1   1    33   1200    Secondary       Married/Cohabitating   College
1   2    35   1100    College         Married/Cohabitating   Secondary
2   1    27   1600    College         Single                 NA
3   1    59   2000    Secondary       Married/Cohabitating   Other
3   2    51   1800    Other           Married/Cohabitating   Secondary 

Единственная идея, которую я мог придумать, - это преобразовать категориальную переменную в числовую, использовать мой метод, а затем преобразовать их снова, но я уверен, что это намного сложнее, чем должно быть.

Может кто-нибудь мне помочь?


person Jodie    schedule 15.08.2020    source источник
comment
Не могли бы вы dput(data) и вставить это в свой вопрос? Намного легче помочь вам, если у нас есть образец ваших данных. Кроме того, если бы вы могли опубликовать образец того, как выглядит ваш желаемый результат, это тоже было бы полезно. Узнайте больше о предоставлении минимального воспроизводимого примера.   -  person Ben Norris    schedule 15.08.2020
comment
@BenNorris Большое спасибо! я собираюсь   -  person Jodie    schedule 15.08.2020


Ответы (1)


Рассмотрим merge решение для сравнения каждой пары друг с другом с помощью id. Окончательное левое соединение merge используется для включения непарных наблюдений из исходных данных.

spouse_merge <- subset(merge(data, data, by="id", suffixes=c("", "_p")),
                       (num < num_p | num > num_p) & 
                       marital_status != "Not applicable" &
                       marital_status_p != "Not applicable")

final_df <- merge(data, spouse_merge[c(1,2, grep("_p", names(spouse_merge)))], 
                  by=c("id", "num"), all.x=TRUE)
final_df

Онлайн-демонстрация

person Parfait    schedule 15.08.2020