2014-02-05 2 views
2

Возможно, глупый вопрос о простой задаче для ddply, но, как ни странно, я не смог найти решение. Итак, допустим, у меня есть dataframe, содержащий респондент в странах, а количество рабочих мест, что ответчик провел в его или ее карьере:Заполнение всех строк соответствующими значениями группы (ddply?)

mydata <- structure(list(country = structure(c(11L, 6L, 7L, 12L, 12L, 3L, 
7L, 10L, 6L, 4L, 5L, 12L, 3L, 1L, 4L, 13L, 2L, 4L, 7L, 3L), contrasts = structure(c(1, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1), .Dim = c(13L, 
12L), .Dimnames = list(c("Austria", "Germany", "Sweden", "Netherlands", 
"Spain", "Italy", "France", "Denmark", "Greece", "Switzerland", 
"Belgium", "Czechia", "Poland"), c("AT", "DE", "SE", "NL", "ES", 
"IT", "FR", "DK", "GR", "CH", "BE", "CZ"))), .Label = c("Austria", 
"Germany", "Sweden", "Netherlands", "Spain", "Italy", "France", 
"Denmark", "Greece", "Switzerland", "Belgium", "Czechia", "Poland" 
), class = "factor"), njobs = c(2, 2, 3, 2, 1, 2, 4, 2, 1, 3, 
2, 3, 3, 2, 8, 3, 1, 2, 9, 3)), .Names = c("country", "njobs" 
), class = "data.frame", row.names = c(NA, -20L)) 

Я хотел бы добавить третий переменный столбец, содержащий в среднее количество рабочих мест в карьере в этой стране. Это легко сделать в две строки:

ctry.means <- ddply(mydata,.(country),summarize,avejobs=mean(njobs)) 
result <- merge(mydata,ctry.means,by="country") 

Однако это такая простая и часто используемая операция, что я чувствую, что должен быть более простой способ сделать это в один шаг, какой-то трюк с ddply. В более общем случае это относится к объединению переменных уровня группы и уровня case в одном заявлении summarize или mutate.

+2

Просто используйте 'transform/mutate' вместо' summaryize'. – Ramnath

+0

Я знал, что обманываю :) Спасибо @Ramnath –

+1

Или с dplyr: 'mydata%.% Group_by (страна)%.% Mutate (avejobs = mean (njobs))' – hadley

ответ

1

если вы счастливы с простым базовым решением,

mydata$new = ave(mydata$njobs, mydata$country) 

будет делать это тоже.

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