R:提高产量

时间:2017-09-06 16:03:23

标签: r dataframe output time-series

以下是我使用vars包创建的用于测试平稳性的示例代码:

library(vars)
data(Canada)
Canada <- data.frame(Canada)

test = function(x) {
  adf <- ur.df(x, type = "trend", selectlags = "BIC")
  adf.out <- format(round(c(adf@teststat[1], head(adf@cval,1)[,c(1,2,3)]), 2), nsmall = 3)
  adf.comment <- if(adf.out[1] >= adf.out[3]) {"Yes"} else {"No"}

  kpss <- ur.kpss(x, type ="tau", use.lag = adf@lags)
  kpss.out <- format(round(c(kpss@teststat[1],head(kpss@cval, 1)[,c(4,2,1)]), 2), nsmall = 3)
  kpss.comment <- if(adf.out[1] >= adf.out[3]) {"Yes"} else {"No"}

  out <- c(adf.out, adf.comment, kpss.out, kpss.comment)
  out
}

test(Canada["prod"][,1])

输出:

> test(Canada["prod"][,1])
             1pct     5pct    10pct                       1pct     5pct    10pct          
"-2.020" "-4.040" "-3.450" "-3.150"     "No"  "0.490"  "0.220"  "0.150"  "0.120"     "No" 

为什么数字周围有“”,我该如何删除它们?

1 个答案:

答案 0 :(得分:0)

您在一个对象stringnumeric中混合了两种R数据类型。 R不能在一个简单对象中携带两种数据类型。结果是它将numeric转换为string - 这由引号显示。当您将string转换为为numeric创建的NA时,这意味着信息丢失,因此R选择转换string中的所有内容。

您可以将数据转换为data.frame(见下文)。因为data.frame是一种复杂的数据类型,它可以为每列保留不同的data.types。我不建议您使用data.frame进行光学目的。如果您想使用此数字进行计算,稍后可以使用函数stringnumeric转换为as.numeric(out)

test = function(x) {
  adf <- ur.df(x, type = "trend", selectlags = "BIC")
  adf.out <- format(round(c(adf@teststat[1], head(adf@cval,1)[,c(1,2,3)]), 2), nsmall = 3)
  adf.comment <- if(adf.out[1] >= adf.out[3]) {"Yes"} else {"No"}

  kpss <- ur.kpss(x, type ="tau", use.lag = adf@lags)
  kpss.out <- format(round(c(kpss@teststat[1],head(kpss@cval, 1)[,c(4,2,1)]), 2), nsmall = 3)
  kpss.comment <- if(adf.out[1] >= adf.out[3]) {"Yes"} else {"No"}

  out <- c(adf.out, adf.comment, kpss.out, kpss.comment)
  out <- data.frame(matrix(out, nrow=1, dimnames=list(NULL, names(out))))
  return(out)
}

test(Canada["prod"][,1])[,-1]