Использование функции apply для вычисления среднего значения столбца - PullRequest
2 голосов
/ 11 июля 2020

После разделения фрейма данных на несколько фреймов данных по странам я хотел иметь возможность вычислить среднее значение централизации столбцов в фрейме данных каждой страны, который я разделил. Я использовал tapply, который работал, и я пытался использовать sapply (), но странно то, что все средние значения страны соответствуют среднему значению первой страны. Я не могу понять, почему, и меня просят использовать sapply в качестве упражнения, поэтому я хотел бы знать, как я могу улучшить свой код. Любой указатель приветствуется. (это может быть глупая ошибка)

INPUT / мой код:

strikes.df = read.csv("http://www.stat.cmu.edu/~pfreeman/strikes.csv")
strikes.by.country=split(strikes.df,strikes.df$country)
my.fun=function(x=strikes.by.country){
  l=length(strikes.by.country)
  for (i in 1:l){
    return(strikes.by.country[[i]]$centralization %>% mean)
  }
}

sapply(strikes.by.country, my.fun)

#using tapply()
tapply(strikes.df[,"centralization",],INDEX=strikes.df[,"country",],FUN=mean)

OUTPUT

   0.374644    0.374644    0.374644    0.374644    0.374644 
    Finland      France     Germany     Ireland       Italy 
   0.374644    0.374644    0.374644    0.374644    0.374644 
      Japan Netherlands New.Zealand      Norway      Sweden 
   0.374644    0.374644    0.374644    0.374644    0.374644 
Switzerland          UK         USA 
   0.374644    0.374644    0.374644

 
  Australia     Austria     Belgium      Canada     Denmark 
0.374644022 0.997670495 0.749485177 0.002244134 0.499958552 
    Finland      France     Germany     Ireland       Italy 
0.750374065 0.002729909 0.249968231 0.499711882 0.250699502 
      Japan Netherlands New.Zealand      Norway      Sweden 
0.124675342 0.749602699 0.375940378 0.875341821 0.875253817 
Switzerland          UK         USA 
0.499990005 0.375946785 0.002390639 

Мне дали инструкцию использовать sapply после использования split; поэтому единственное, что мне пришло в голову, это использование циклов for.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Лучше использовать sapply в названиях стран unique. На самом деле нет необходимости что-либо разделять.

sapply(unique(strikes.df$country), function(x) 
  mean(strikes.df[strikes.df$country == x, "centralization"]))
#   Australia     Austria     Belgium      Canada     Denmark     Finland      France 
# 0.374644022 0.997670495 0.749485177 0.002244134 0.499958552 0.750374065 0.002729909 
#     Germany     Ireland       Italy       Japan Netherlands New.Zealand      Norway 
# 0.249968231 0.499711882 0.250699502 0.124675342 0.749602699 0.375940378 0.875341821 
#      Sweden Switzerland          UK         USA 
# 0.875253817 0.499990005 0.375946785 0.002390639 

Но если вы также полагаетесь на использование split, вы можете сделать:

sapply(split(strikes.df$centralization, strikes.df$country), mean)
#   Australia     Austria     Belgium      Canada     Denmark     Finland      France 
# 0.374644022 0.997670495 0.749485177 0.002244134 0.499958552 0.750374065 0.002729909 
#     Germany     Ireland       Italy       Japan Netherlands New.Zealand      Norway 
# 0.249968231 0.499711882 0.250699502 0.124675342 0.749602699 0.375940378 0.875341821 
#      Sweden Switzerland          UK         USA 
# 0.875253817 0.499990005 0.375946785 0.002390639 

Или напишите это в две строки:

s <- split(strikes.df$centralization, strikes.df$country)
sapply(s, mean)

Edit

Если требуется split ting всего фрейма данных, выполните

s <- split(strikes.df, strikes.df$country)
sapply(s, function(x) mean(x[, "centralization"]))

или

foo <- function(x) mean(x[, "centralization"])
sapply(s, foo)
0 голосов
/ 11 июля 2020

Используя набор данных gapminder::gapminder в качестве примера данных, этого можно достичь следующим образом:

Пример кода вычисляет среднюю ожидаемую продолжительность жизни (lifeExp) по continent.

# sapply: simplifies. returns a vector
sapply(split(gapminder::gapminder, gapminder::gapminder$continent), function(x) mean(x$lifeExp, na.rm = TRUE))
#>   Africa Americas     Asia   Europe  Oceania 
#> 48.86533 64.65874 60.06490 71.90369 74.32621
# lapply: returns a list
lapply(split(gapminder::gapminder, gapminder::gapminder$continent), function(x) mean(x$lifeExp, na.rm = TRUE))
#> $Africa
#> [1] 48.86533
#> 
#> $Americas
#> [1] 64.65874
#> 
#> $Asia
#> [1] 60.0649
#> 
#> $Europe
#> [1] 71.90369
#> 
#> $Oceania
#> [1] 74.32621
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...