apply.yearly () работает с подмножеством, но не с полным набором данных временных рядов в R - PullRequest
0 голосов
/ 23 мая 2018

Когда я запускаю следующий код в моем наборе данных, я получаю вывод (показан частичный), например:

all_countries_ts[,grepl("Muslims", colnames(all_countries_ts))]

             Senegal Muslims Serbia Muslims Seychelles Muslims
1970-01-01         3693807         200000                170
2000-01-01         8936283         529322                730
2010-01-01        11713126         527598                821
2015-01-01        13621382         471414                844

Однако, когда я пытаюсь использовать функцию apply.yearly для него, чтобы сложитьчерез несколько лет я просто получаю результат NA:

apply.yearly(all_countries_ts[,grepl("Muslims", colnames(all_countries_ts))], FUN = sum)

1970-01-01   NA
2000-01-01   NA
2010-01-01   NA
2015-01-01   NA

Самое смешное, что он работает с одними входами, но не с другими.Например, если я использую ввод «Агностика» вместо «Мусульмане», я получаю хороший результат.Там нет ошибки, поэтому я не могу понять, что именно здесь происходит.

all_countries_ts хранится как объект xts.Следует отметить, что apply.yearly () всегда работает с подмножеством этого набора данных.Я написал функцию, и вы можете увидеть ее ниже:

sum_by_category <- function(religious_group, dataset) {
apply.yearly(dataset[,grepl(paste(religious_group), colnames(dataset))], FUN = 
sum)
}

country_search <- function(country_name, z){
  z <- foreach(i = 1:length(country_name), .combine = merge.xts) %do%{
    all_countries_ts[,grepl(country_name[i], colnames(all_countries_ts))]
  }
  return(z)}

Когда я набираю следующее, оно отлично работает:

sum_by_category("Muslims", country_search("Senegal"))
               Senegal Muslims
1970-01-01         3693807
2000-01-01         8936283
2010-01-01        11713126
2015-01-01        13621382

Я действительно не могу понять, что происходиттак как он работает с некоторыми входами, а не с другими.Заранее благодарим за любую помощь / понимание!

1 Ответ

0 голосов
/ 23 мая 2018

xts::apply.yearly ожидает, что x аргумент может быть преобразован в xts объект.Возможно, ваш data.frame не является xts совместимым фреймом данных.

Справка для apply.yearly объясняет:

Аргументы

x     an time-series object coercible to xts
FUN   an R function

Я создал образец данных на основеданные передаются OP и преобразуются в класс xts.apply.yearly работает правильно на том же самом.

library(xts)

# Convert data.frame to xts class
all_countries_ts <- xts(df[,-1], order.by = df$Date)

#Now one can use `apply.yearly`
apply.yearly(all_countries_ts[,grepl("Muslims", colnames(all_countries_ts))], FUN = sum)

#                [,1]
# 1970-01-01  3893977
# 2000-01-01  9466335
# 2010-01-01 12241545
# 2015-01-01 14093640

Отредактировано: Анализ данных ОП предполагает, что он содержит NA для многих столбцов, в результате чего общая сумма будет отображаться какNA.Исправить это просто.ОП необходимо использовать как:

apply.yearly(all_countries_ts[,grepl("Muslims",colnames(all_countries_ts))],
                FUN = sum, na.rm = TRUE)

#                  [,1]
# 1970-01-01  570772699
# 2000-01-01 1292170756
# 2010-01-01 1571250533
# 2015-01-01 1734531709

Данные:

df <- read.table(text = 
" Date             'Senegal Muslims' 'Serbia Muslims' 'Seychelles Muslims' Others
1970-01-01         3693807         200000                170               200
2000-01-01         8936283         529322                730              100
2010-01-01        11713126         527598                821              300
2015-01-01        13621382         471414                844              500",
header = TRUE, stringsAsFactors = FALSE)

#convert Date column to Date format
df$Date <- as.Date(df$Date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...