Неправильный возврат при использовании tapply в R

Я работаю с функцией tapply в R. Я просто пытаюсь заставить функцию tapply возвращать те же результаты, что и функция sapply (тот, который, как я уверен, верен).

ЦЕЛЬ:

Я работаю с данными state.x77 и пытаюсь найти уровень грамотности в каждом регионе, используя функции sapply и tapply.

КОД:

####Setting up the data
state.df = data.frame(state.x77, Region=state.region, Division=state.division)
state.by.region = split(state.df, f=state.region)
state.by.div = split(state.df, f=state.division)

####Tapply
tapply(state.df$Illiteracy, INDEX = state.region,FUN = function(v){
  li.rate = 100 - state.df$Illiteracy
  return(median(li.rate))
})

Я вижу, что использую разные фреймы данных для tapply. Я думаю, что ДОЛЖЕН использовать state.by.region, но я просто не могу заставить его работать. Лучшее, что я могу придумать, это:

tapply(state.by.region[,"Illiteracy"], INDEX = state.region, FUN = function(v){
  li.rate = 100 - state.by.region$Illiteracy
  return(median(li.rate))
})

Что я могу попробовать дальше?


person CPTxShamrock    schedule 29.04.2020    source источник


Ответы (2)


В анонимной функции tapply вы должны вычесть 100 на v, а не на state.df$Illiteracy, так как вычитание на v означает, что вы принимаете значения только для этого Region, а не для полного фрейма данных. Также вам не нужно split данные, вы можете ссылаться на имя столбца как INDEX.

tapply(state.df$Illiteracy, INDEX = state.df$Region,FUN = function(v){
      li.rate = 100 - v
      return(median(li.rate))
})

#    Northeast         South North Central          West 
#        98.90         98.25         99.30         99.40 
person Ronak Shah    schedule 29.04.2020
comment
Ронак, большое спасибо. Я вижу, где я не использовал v через свою функцию. Я чувствую себя немного глупо по этому поводу. - person CPTxShamrock; 29.04.2020

Просто добавлю еще одну мысль, поскольку вы сказали, что считаете, что должны использовать «state.by.region». В документации сказано, что tapply принимает вектор, подобный объекту, вы можете поместить «state.by.region» вне tapply и внутри sapply. Это приводит к другой форме ответа, но все равно должно получить то, что вы хотите.

sapply(state.by.region, 
       function(v) tapply(v$Illiteracy, INDEX = v$Region, function(y) median(100-y)))

#               Northeast South North Central West
# Northeast          98.9    NA            NA   NA
# South                NA 98.25            NA   NA
# North Central        NA    NA          99.3   NA
# West                 NA    NA            NA 99.4
person K.-T. Chen    schedule 29.04.2020