Неправильный возврат при использовании tapply [r] - PullRequest
0 голосов
/ 29 апреля 2020

ИНФОРМАЦИЯ: Добрый вечер всем. Как видно из названия, я работаю с функцией tapply. Я просто пытаюсь заставить функцию tapply возвращать те же результаты, что и функция sapply (я уверен, что она верна).

Язык: R

ЦЕЛЬ: Я работаю с данные 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, но просто не могу получить его до go. Лучшее, что я могу придумать:

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

ЛЮБАЯ помощь, пожалуйста.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

В анонимной функции 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 
0 голосов
/ 29 апреля 2020

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

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
...