如果我有一个包含600列(变量)的data.frame(sum_clus)和没有NA并且都是数值的10行,我该如何创建5个新变量,这些变量为我提供该行中前5个变量的列名?
例如.
max <- apply(sum_clus ,1, max)
for(ii in 1:10) sum_clus$max[ii] <- colnames(sum_clus)[which(sum_clus[ii , ]
== sum_clus[ii, sum_clus[ii,] == max[ii]])]
Run Code Online (Sandbox Code Playgroud)
上面的代码帮助我创建了一个变量sum_clus $ max,它给出了每行中max变量的列名.同样,我怎样才能获得5个这样的变量,它们给出了前5个变量的列名?sum_clus $ max,sum_clus $ second_but_max等等.
提前致谢!
大多数专业用户建议我永远不要在R中使用循环.请改用apply函数.问题是,如果您不熟悉函数式编程,那么为每个for/while循环编写一个应用等效项并不是那么直观.以下面的例子为例.
F <- data.frame(name = c("a", "b", "c", "d"), var1 = c(1,0,0,1), var2 = c(0,0,1,1),
var3 = c(1,1,1,1), clus = c("one", "two", "three", "four"))
F$ObjTrim <- ""
for (i in 1:nrow(F))
{
for (j in 2:(ncol(F)-1))
{
if(F[i, j] == 1)
{F$ObjTrim[i] <- paste(F$ObjTrim[i], colnames(F)[j], sep = " ") }
}
print(i)
}
Run Code Online (Sandbox Code Playgroud)
这里的目标是创建一个变量"ObjTrim",它接受所有具有值== 1的列名的值.有人可以建议一个等同于此的良好应用吗?
例如,上面的代码将给出:
name var1 var2 var3 clus ObjTrim
1 a 1 0 1 one var1 var3
2 b 0 0 1 two var3
3 c 0 …Run Code Online (Sandbox Code Playgroud) 我在使用R中的函数arma {tseries}和arima {stats}拟合ARMA模型时发现了一些奇怪的东西.
两个函数采用的估计程序存在根本区别,即在arma {stats}中的卡尔曼滤波器,而不是arma {tseries}中的ML估计.
鉴于两个函数之间的估计过程存在差异,如果我们使用相同的时间序列,则不会期望两个函数的结果完全不同.
好吧他们可以!
生成以下时间序列并添加2个异常值.
set.seed(1010)
ts.sim <- abs(arima.sim(list(order = c(1,0,0), ar = 0.7), n = 50))
ts.sim[8] <- ts.sim[12]*8
ts.sim[35] <- ts.sim[32]*8
Run Code Online (Sandbox Code Playgroud)
使用这两个函数拟合ARMA模型.
# Works perfectly fine
arima(ts.sim, order = c(1,0,0))
# Works perfectly fine
arma(ts.sim, order = c(1,0))
Run Code Online (Sandbox Code Playgroud)
将时间序列的级别更改为10亿
# Introduce a multiplicative shift
ts.sim.1 <- ts.sim*1000000000
options(scipen = 999)
summary(ts.sim.1)
Run Code Online (Sandbox Code Playgroud)
使用2个函数拟合ARMA模型:
# Works perfectly fine
arma(ts.sim.1, order = c(1,0))
# Does not work
arima(ts.sim.1, order = c(1,0,0))
## Error …Run Code Online (Sandbox Code Playgroud)