1

これは、時間をかけて名前の性別をエンコードしたいサンプルデータです。

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いる現在の値を渡そうとすると、エラーメッセージが表示されます。yearddply

Error in filter_impl(.data, dots(...), environment()) : 
  (list) object cannot be coerced to type 'integer'

yearonの現在の値を に渡すにはどうすればよいddplyですか?

4

1 に答える 1

1

内部で結合しようとすることで、物事が複雑になりすぎていると思いますddply。私が使用する場合、dplyrおそらく次のようなことをするでしょう:

names_to_encode <- structure(list(name = 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("name", "year"), row.names = c(NA, -6L), class = "data.frame")

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"))

names_to_encode$name <- as.character(names_to_encode$name)
names_to_encode$year <- as.integer(names_to_encode$year)

tmp <- left_join(ssa_demo,names_to_encode) %.%
        group_by(year,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 = ifelse(proportion_female == 0.5,"either",
                        ifelse(proportion_female > 0.5,"female","male")))

0.1.1 は結合列の型に関してまだ少し細かいことに注意してください。そのため、それらを変換する必要がありました。github でいくつかのアクティビティを見たと思いますが、それは開発バージョンで修正されたか、少なくとも彼らが取り組んでいるものでした。

于 2014-02-21T15:51:14.390 に答える