2017-01-04 17 views
0

Я возвращаюсь к предыдущему вопросу/сообщению, для которого у меня есть хорошие предложения, но нужно дополнительное толчок: идея состоит в создании двоичной переменной, которая принимает независимо от количества членов семьи. Это значение разделяют все члены одной семьи. я поставил опять reproducive пример:Идентификация групп лиц, если условное возникновение в одном из них (следующее)

 family <- factor(rep(c("001","002","003"), c(10,8,15)),levels=c("001","002","003"), labels=c("001","002","003"), ordered=TRUE) 
     sx <- c(1,2,2,2,1,2,2,2,1,1,2,1,2,1,2,1,2,2,2,2,1,2,1,2,1,2,1,2,1,2,1,2,2) 
     ag <- c(22,8,4,2,55,9,44,65,1,7,32,2,2,1,6,9,18,99,73,1,2,3,4,5,6,7,8,9,10,18,11,22,33) 
     st <- factor(rep(c("a","b","c"),11)) 
     DF <- data.frame(family, ag,sx,st) ; DF 

Один хороший трюк, предложенный @Psidom позволило мне создать эту новую переменную NoMan, принимая значение 1 для всех людей из семьи, которая не включает в себя любой человек старше 16 лет:

 DF <- ddply(DF, .(family), transform, NoMan = +!any(sx == 1 & ag > 16)) ; DF ## works well !! 

Я сейчас пытаюсь добавить еще одно условие, связанные с возрастом: NoMan также будет равна 1 всякий раз, когда какой-либо из членов семьи мужского пола старше 16 имеет «а» или «б» в качестве атрибута для фактора st. я попытался следующие, но это не сработало:

 DF <- ddply(DF, .(family), transform, NoMan = !any(sx == 1 & ag > 16) | 
              all(sx == 1 & ag > 16 & st=="a") | 
              all(sx == 1 & ag > 16 & st=="b")) ; DF 

Любой ключ о причине семьи 001 не принимает значение 1 в NoMan? Спасибо ...

ответ

1

Сравните со следующим:

DF <- ddply(DF, .(family), transform, NoMan = +!any((sx == 1 & ag > 16) & 
    ((sx == 1 & ag > 16 & st != "a") & (sx == 1 & ag > 16 & st != "b")))) 

Или использовать упрощенный один

DF <- ddply(DF, .(family), transform, NoMan = +!any(sx == 1 & ag > 16 
              & (st != "a" & st != "b"))) 
+0

Спасибо за ваш ответ, кажется, работает, но я не уверен, я понимаю (и я бы хотел): в вашем первом предложении, которое я предпочитаю, функция '+! any (' сначала определит семейства без какого-либо человека> 16 '(sx == 1 & ag> 16)', что прекрасно, но тогда '+! any (' также относится ко второму выражению no? i ожидало бы, что оно даст значение «1» всем членам, не имеющим ЛЮБОГО человека> 16 с 'st ==" a "или' st == "b" '? – den

+0

Спасибо @ Даршан! я понимаю, это нелегко! я мог проверить, что это работает с использованием немного другого 'DF':' family <- factor (rep (c («001», «002», «003», «004»), c (10,8,15 , 3)), уровни = c («001», «002», «003», «004»), метки = c («001», «002», «003», «004»), упорядоченные = TRUE) sx <- c (2,2,2,2,1,2,2,2,1,1,2,1,2,1,2,1,2,2,2,2,1,2,2 , 1,2,1,2,1,2,1,2,1,2,2,2,1,1) ag <- c (22,8,4,2,55,9,44,65) , 1,7,32,2,2,1,6,9,18,99,73,1,2,3,4,5,6,7,8,9,10,18,11,22,33 , 19,5,19) st <- factor (rep (c ("a", "b", "c"), 12)) DF <- data.frame (family, ag, sx, st); DF ' – den

 Смежные вопросы

  • Нет связанных вопросов^_^