Вот некоторые выборочные данные, для которых я хочу, чтобы закодировать пол имен с течением времени:Передача текущего значения ddply разделения на функцию
names_to_encode <- structure(list(names = structure(c(2L, 2L, 1L, 1L, 3L, 3L), .Label = c("jane", "john", "madison"), class = "factor"), year = c(1890, 1990, 1890, 1990, 1890, 2012)), .Names = c("names", "year"), row.names = c(NA, -6L), class = "data.frame")
Вот минимальный набор данных по социальному обеспечению, ограниченный только те имена, с 1890 по 1990 год:
ssa_demo <- structure(list(name = c("jane", "jane", "john", "john", "madison", "madison"), year = c(1890L, 1990L, 1890L, 1990L, 1890L, 1990L), female = c(372, 771, 56, 81, 0, 1407), male = c(0, 8, 8502, 29066, 14, 145)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("name", "year", "female", "male"))
Я определил функцию, которая подмножество данных по социальному обеспечению, приведенным в году или диапазон лет. Другими словами, он вычисляет, было ли имя мужчиной или женщиной в течение определенного периода времени, выясняя пропорцию мужских и женских родов с этим именем. Вот функция, наряду с вспомогательной функцией:
require(plyr)
require(dplyr)
select_ssa <- function(years) {
# If we get only one year (1890) convert it to a range of years (1890-1890)
if (length(years) == 1) years <- c(years, years)
# Calculate the male and female proportions for the given range of years
ssa_select <- ssa_demo %.%
filter(year >= years[1], year <= years[2]) %.%
group_by(name) %.%
summarise(female = sum(female),
male = sum(male)) %.%
mutate(proportion_male = round((male/(male + female)), digits = 4),
proportion_female = round((female/(male + female)), digits = 4)) %.%
mutate(gender = sapply(proportion_female, male_or_female))
return(ssa_select)
}
# Helper function to determine whether a name is male or female in a given year
male_or_female <- function(proportion_female) {
if (proportion_female > 0.5) {
return("female")
} else if(proportion_female == 0.5000) {
return("either")
} else {
return("male")
}
}
Теперь то, что я хочу сделать, это использовать plyr, в частности ddply
, чтобы подмножество данных, подлежащих закодированные в год, и объединить каждый из этих частей со значением возвращенного по функции select_ssa
. Это код, который у меня есть.
ddply(names_to_encode, .(year), merge, y = select_ssa(year), by.x = "names", by.y = "name", all.x = TRUE)
При вызове select_ssa(year)
, эта команда работает просто отлично, если я жесткий код значение как 1890
в качестве аргумента функции. Но когда я пытаюсь передать его текущее значение year
, что ddply
работает с, я получаю сообщение об ошибке:
Error in filter_impl(.data, dots(...), environment()) :
(list) object cannot be coerced to type 'integer'
Как я могу передать текущее значение year
на ddply
?
Это замечательно и работает для этих наборов данных. Моя трудность заключается в том, что я пишу это для R-пакета, и поэтому я не могу сделать предположения, что столбец имен называется 'name', а столбец года назван' year' в данных пользователя. В этом раннем question я узнал, что dplyr не позволяет вам указывать столбцы для соединения. Должен ли я просто заставить пользователя переименовать столбцы? –
@ LincolnMullen Вы можете группировать программно в dplyr, используя 'regroup', если это помогает. См. [Здесь] (http://stackoverflow.com/q/21815060/324364). – joran