У меня есть фрейм данных с: «серийным» количеством домашних хозяйств, каждое с переменным количеством компонентов «глава, супруга, родитель и ребенок или внук» и общим количеством детей в доме «nchild»

Я хочу создать новую переменную (в dput я добавил пример для ясности: withCM «жить с ребенком мужского пола» и withCF). Я пробовал различные комбинации, но я не могу различить пол ребенка в одном и том же "сериале", так что для withCM = 1 только при relate == "child" & sex == 1, но 1 будет отображаться в другой строке (глава, супруга или родитель)

mydata$withCM<- ifelse(mydata$nchild>0&mydata$relate!="child",1,0)

mydata <- structure(list(serial = c(12345L, 12345L, 12345L, 12345L, 12346L, 
12346L, 12347L, 12347L, 12347L, 12348L, 12348L, 12348L, 12348L, 
12348L, 12348L, 12348L, 12349L, 12350L, 12350L, 12351L, 12351L, 
12351L, 12352L, 12352L, 12352L, 12352L, 12352L, 12353L, 12354L, 
12354L), age = c(45L, 44L, 13L, 11L, 29L, 28L, 65L, 61L, 35L, 
68L, 61L, 35L, 34L, 6L, 2L, 1L, 62L, 54L, 52L, 67L, 67L, 12L, 
49L, 50L, 28L, 21L, 22L, 70L, 89L, 55L), sex = c(1L, 2L, 2L, 
1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 
1L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L), relate = structure(c(4L, 
7L, 1L, 1L, 4L, 7L, 6L, 6L, 4L, 4L, 7L, 1L, 2L, 3L, 3L, 3L, 4L, 
4L, 7L, 4L, 7L, 3L, 4L, 7L, 1L, 5L, 5L, 4L, 6L, 4L), .Label = c("child", 
"childinlaw", "grandchild", "head", "nonrelative", "parent", 
"spouse"), class = "factor"), nchild = c(2L, 2L, 0L, 0L, 0L, 
 0L, 1L, 1L, 0L, 1L, 1L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L), conhija = c(1L, 1L, 0L, 
 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L), conhijo = c(1L, 
 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 
 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("serial", 
 "age", "sex", "relate", "nchild", "conhija", "conhijo"), class = "data.frame", row.names = c(NA, 
 -30L))
0
Ale 3 Апр 2014 в 18:35

2 ответа

Лучший ответ

Вы можете табулировать пол, семью и роли в семье как:

xtab <- table(mydata$serial, mydata$sex, mydata$relate)

А затем выберите глав семей (или, в строке с комментариями, любого, кто имеет определенные отношения), и измените их результаты следующим образом:

mydata$sex1 <- 0
mydata$sex2 <- 0
ind <- mydata$relate=="head"
#ind <- mydata$relate %in% c("head","spouse","parent")
mydata$sex1[ind] <- xtab[as.character(mydata$serial[ind]), "1", "child"]
mydata$sex2[ind] <- xtab[as.character(mydata$serial[ind]), "2", "child"]
1
Gavin Kelly 3 Апр 2014 в 19:17
Привет, Гэвин, спасибо за предложение. По сути, моя новая переменная должна быть идентична «conhijo», если пол ребенка = 1, и равна «conhija», если пол ребенка = 2, но только для тех, у кого nchild> 0, например. CONHIJO==1, ЕСЛИ NCHILD>0 И ПОЛ ребенка в одном и том же SERIAL ==1. Я попробовал ваш способ, но мне все еще чего-то не хватает
 – 
Ale
3 Апр 2014 в 19:55
Итак, возьмем в качестве примера серийный номер = 12345 - есть и пол = 2, и пол = 1 дочерние элементы, поэтому в этом случае новая переменная должна быть равна conhijo или conhija (и в какой строке мы должны установить значение этой переменной? везде, где nchild! =0?)
 – 
Gavin Kelly
3 Апр 2014 в 20:01
Изменен на этот mydata$ind <- mydata$nchild>0, так как он дает мне места, где я хочу поставить 1, если пол ребенка в сериале равен 1 и 0 в противном случае
 – 
Ale
3 Апр 2014 в 20:04
Извините, не могли бы вы уточнить. Показали ли вы нам conhija и conhijo в качестве примеров переменных, которые вы просите нас воссоздать; или это существующие переменные, которые мы должны использовать в каких-то дальнейших расчетах?
 – 
Gavin Kelly
3 Апр 2014 в 20:09
Потому что, если вы просите нас воссоздать conhija, я делаю это, устанавливая ind как в вашем комментарии, а также изменяя строку sex1, заключая правую часть присваивания в ifelse(xtab[....]>0, 1,0)
 – 
Gavin Kelly
3 Апр 2014 в 20:14

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

lives_with_boy <- function(serial)
{
  unit <- mydata[mydata$serial==serial,]
  as.character(unit$relate) %in% c("head","spouse","parent") & any(unit$relate == "child" & unit$sex==1)
}

mydata$withCM <- unlist(lapply(unique(mydata$serial),lives_with_boy ))
1
Miff 3 Апр 2014 в 20:28