Как создать новый набор данных на основе нескольких условий в R? - PullRequest
1 голос
/ 13 апреля 2020

У меня есть набор данных с именем carcom, который выглядит следующим образом

carcom <- data.frame(household = c(173, 256, 256, 319, 319, 319, 422, 422, 422, 422), individuals= c(1, 1, 2, 1, 2, 3, 1, 2, 3, 4))

Где люди называют отца «1», мать «2», ребенок «3» и «4». Что бы я хотел получить две новые колонки. Сначала следует указать количество детей в этом домохозяйстве, если оно есть. Во-вторых, присваивая вес каждому человеку соответственно «1» для отца, «0,5» для матери и «0,3» для каждого ребенка. Мой новый набор данных должен выглядеть следующим образом

newcarcom <- data.frame(household = c(173, 256, 319, 422), child = c(0, 0, 1, 2), weight = c(1, 1.5, 1.8, 2.1)

Я пытался найти решения в течение нескольких дней. Был бы признателен, если кто-то поможет мне. Спасибо

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Мы можем посчитать число individuals со значениями 3 и 4 в каждом household. Чтобы вычислить weight, мы изменяем значение для 1: 4 на соответствующие значения веса, используя recode, а затем принимаем sum.

library(dplyr)

newcarcom <- carcom %>%
  group_by(household) %>%
  summarise(child = sum(individuals %in% 3:4), 
            weight = sum(recode(individuals,`1` = 1, `2` = 0.5, .default = 0.3)))

#  household child weight
#      <dbl> <int>  <dbl>
#1       173     0    1  
#2       256     0    1.5
#3       319     1    1.8
#4       422     2    2.1

Версия Base R, предложенная @ markus

newcarcom <- do.call(data.frame, aggregate(individuals ~ household, carcom, function(x) 
      c(child = sum(x %in% 3:4), weight = sum(replace(y <- x^-1, y < 0.5, 0.3))))) 
0 голосов
/ 13 апреля 2020

Опция с data.table

library(data.table)
setDT(carcom)[, .(child = sum(individuals %in% 3:4), 
        weight = sum(recode(individuals,`1` = 1, `2` = 0.5, .default = 0.3))), household]
...