带有rowMeans问题的简单for循环(“ x”必须是至少二维的数组)

时间:2018-09-07 17:00:27

标签: r for-loop dataframe

我正在处理一个问题,该数据集包含美国所有州的每月失业率数据,我必须使用前4个月的平均值来计算每个特定月份的失业率。

我的数据集是“原始”数据,是一个50x416的矩阵,其中的行代表状态,而列则代表月份和数据。我不得不删除最后50列,因为它们将在以后用作测试数据。

我试图创建一个for循环,在该循环中我将使用rowMeans计算特定月份中每个州的均值。但是,当我尝试运行for循环时,出现以下错误:

  

'x'必须是至少二维的数组。

我已经在论坛上阅读了一些主题,这些主题指出必须将数据转换为data.frame并添加drop=FALSE才能保持尺寸,但是它们似乎都不起作用。

naiveds = rawt[, 1:366] #dataset
naiveds = data.frame(naiveds) #convert to dataframe
naiveavg = matrix(1, nrow = 50, ncol = 362) #create matrix with averages
naiveavg = data.frame(naiveavg) #convert to dataframe

for (i in 1:362) {
  naiveavg[, i] = rowMeans(naiveds[, i:i + 3], drop=FALSE)
}

谁知道答案?将不胜感激!

谢谢, RS

1 个答案:

答案 0 :(得分:0)

答案转到OP。 冒号(:)运算符比加法(+)运算符具有更高的优先级。因此,对于a:b + c,首先创建一个从ab的整数向量,然后将c添加到向量的每个元素。在a:(b + c)的情况下,创建了一个从ab + c的整数矢量。请参见下面的代码:

# simulation
rawt <- matrix(abs(rnorm(416 * 50)), ncol = 416)

# OP code
naiveds = rawt[, 1:366] #dataset
naiveds = data.frame(naiveds) #convert to dataframe
naiveavg = matrix(1, nrow = 50, ncol = 362) #create matrix with averages
naiveavg = data.frame(naiveavg) #convert to dataframe

for (i in 1:362) {
  naiveavg[, i] = rowMeans(naiveds[, i:(i + 3)])
}
head(naiveavg[, 1:10])

输出:

         X1        X2        X3        X4        X5        X6        X7        X8        X9       X10
1 1.0236264 1.1506134 0.6025684 0.4575390 0.4129575 0.4811697 0.4954972 0.5351069 0.8029415 0.7665286
2 0.5774167 0.9121022 0.8317297 1.1379453 1.2495575 0.9101162 1.0112815 0.7755866 0.9265676 1.1548026
3 0.7873192 1.1368723 1.1991596 1.1315374 0.9370383 0.5907627 0.7075796 0.9077979 0.8636132 0.9696761
4 0.7503767 0.7663302 0.9274636 0.8134924 0.8519011 1.1361044 1.0493983 1.1042020 0.8107891 0.5100895
5 0.9922414 0.8016487 0.6029256 0.6690121 0.5263644 0.3952237 0.5052323 0.2087226 0.2059480 0.5512362
6 0.9643362 0.8513484 1.0880347 0.8930363 1.0125207 1.1518902 0.9922219 1.1322379 0.9680500 1.1018722

NB。我建议您仔细考虑一下失业率均值的计算公式。通常,不知道一个州的总人口是无法计算费率的平均值的。仅在州人口不随月份变化的情况下才有可能。