【问题标题】:Fitting data frame probability distributions with different lengths - EnvStat - looping in R拟合具有不同长度的数据帧概率分布 - EnvStat - 在 R 中循环
【发布时间】:2022-01-07 20:43:45
【问题描述】:

我正在尝试使用 EnvStat 包拟合 R 中的概率分布,并循环一次计算多个列。 列的长度不同,并且发生了一些代码错误。数据框不会保留为数字格式。 错误消息:“x”必须是数字向量 我无法识别错误。有人可以帮忙吗? 非常感谢

关注代码:

x = runif(n = 50, min = 1, max = 12)
y = runif(n = 70, min = 5, max = 15)
z = runif(n = 35, min = 1, max = 10)
m = runif(n = 80, min = 6, max = 18)

length(x) = length(m)
length(y) = length(m)
length(z) = length(m)

df = data.frame(x=x,y=y,z=z,m=m)
df

library(EnvStats)

nproc = 4
cont = 1
dfr = data.frame(variavel = character(nproc), 
                 locationevd= (nproc), scaleevd= (nproc),
                 stringsAsFactors = F)


# i = 2

for (i in 1:4) {
  
  print(i) 
  
  nome.var=colnames(df)
  
  df = df[,c(i)]
  df = na.omit(df)
  
  variavela = nome.var[i]
  dfr$variavel[cont] = variavela
  
  evd = eevd(df);evd
  locationevd = evd$parameters[[1]]
  dfr$locationevd[cont] = locationevd
  scaleevd = evd$parameters[[2]]
  dfr$scaleevd[cont] = scaleevd

  cont = cont + 1
  
}

writexl::write_xlsx(dfr, path = "Results.xls")

【问题讨论】:

  • 为什么不将它们放在一个列表中,而不是扩展较短的向量以将它们放在一个数据框中?

标签: r dataframe loops variable-length envstats


【解决方案1】:

对您的代码进行了两项重大更改: 首先,使用列表而不是数据框(这样您就可以容纳不等的向量长度):

x = runif(n = 50, min = 1, max = 12)
y = runif(n = 70, min = 5, max = 15)
z = runif(n = 35, min = 1, max = 10)
m = runif(n = 80, min = 6, max = 18)


vl = list(x=x,y=y,z=z,m=m)
vl
if (!require(EnvStats){ install.packages('EnvStats'); library(EnvStats)}
   
nproc = 4
# cont = 1   Not used
dfr = data.frame(variavel = character(nproc), 
                 locationevd= (nproc), scaleevd= (nproc),
                 stringsAsFactors = F)

第二种:使用一个循环索引而不是使用“cont”索引

for ( i in 1:length(vl) ) {
    # print(i)    Not needed
    nome.var=names(vl)  # probably should have been done before loop
    var = vl[[i]]
    variavela = nome.var[i]
    dfr$variavel[i] = variavela  # all those could have been one step
    
    evd = eevd( vl[[i]] )   # ;evd
    locationevd = evd$parameters[[1]]
    dfr$locationevd[i] = locationevd
    scaleevd = evd$parameters[[2]]
    dfr$scaleevd[i] = scaleevd
}

这会得到你想要的结构:

 dfr
  variavel locationevd scaleevd
1        x    5.469831 2.861025
2        y    7.931819 2.506236
3        z    3.519528 2.040744
4        m   10.591660 3.223352

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2021-10-04
    • 1970-01-01
    • 2014-11-14
    • 2014-04-12
    相关资源
    最近更新 更多