Я собираю данные опроса (используя комплект открытых данных), и моя полевая группа, благослови их сердца, иногда проявляет некоторую изобретательность в написании имен людей. Итак, у меня есть «правильное» имя респондента, а также переменная возраста для некоторых записей, которая связана с переменной «имя члена семьи». В семье много разновозрастных членов семьи. Мне нужен возраст респондента.
Вот некоторые поддельные данные, которые иллюстрируют мою проблему:
#the respondent
r = data.frame(name = c("Barack Obama", "George Bush", "Hillary Clinton"))
#a male member
m = data.frame(name = c("Barack Obama","George", "Wulliam Clenton"), age = c(55,59,70)); m$name=as.character(m$name)
#a female member
f = data.frame(name = c("Michelle O","Laura Busch", "Hillary Rodham Clinton"), age = c(54,58,69)); f$name=as.character(f$name)
#if the responsent is the the given member, record their age. if not, NA
a = cbind(
ifelse(r$name==m$name,m$age,NA)
,ifelse(r$name==f$name,f$age,NA)
)
#make a function for plyr that gives me the age of the matched respondent
f = function(row){
d = row[is.na(row)==0]
ifelse(length(d)==0,NA,d)
}
require(plyr)
b = aaply(a,.margins=1,.fun=f)
data.frame(names=r$name,age=b)
names age
1 Barack Obama 55
2 George Bush NA
3 Hillary Clinton NA
what.I.would.like = data.frame(names=c("Barack Obama", "George Bush", "Hillary Clinton"),age = c(55,59,70))
1> what.I.would.like
names age
1 Barack Obama 55
2 George Bush 59
3 Hillary Clinton 70
по моим реальным данным, у меня сотни людей и до 13 членов семьи. С тех пор я изменил опрос, чтобы регистрировать возраст респондентов отдельно, но у меня есть беспорядок данных, которые нужно очистить.