0

由于错误消息,我变得疯狂。我完全使用了脚本,但使用了另一个矩阵,我无法再计算行和。

我收到了这个烦人的错误信息:

x 必须是至少为二维的数组

我想计算矩阵影响中第 15 列的行总和。

share <- rowSums(impact[,15],na.rm=T)

head(impact)
        ID  key bank    group   iob X2014.01    X2014.02    X2014.03    X2014.04    X2014.05    X2014.06    X2014.07    X2014.08    X2014.09    X2014.10    X2014.11    X2014.12    X2015.01    X2015.02    X2015.03    X2015.04    X2015.05    X2015.06    X2015.07    X2015.08
2   1   NA  NA  2   1   0.445205069 0.472390737 0.870477062 0.217721722 0.45105155  0.081988816 0.787682077 0.117770855 0.140369528 0.369301296 0.134638046 0.317541225 0.119500371 0.04335953  0.21347215  0.98924849  0.056345003 0.630135217 0.775518542 0.497615742
10  1   NA  NA  2   1   0.168419591 0.425645354 0.646613563 0.664511712 0.750356605 0.93621874  0.535499019 0.654868051 0.346500111 0.257706661 0.538854079 0.440520153 0.902426669 0.62364293  0.034292533 0.164502657 0.708733663 0.416106117 0.55308097  0.961736416
18  1   NA  NA  2   1   0.619040555 0.831943026 0.502364121 0.897383629 0.161324917 0.645435861 0.381065769 0.144287435 0.211246426 0.824972697 0.966528838 0.084932473 0.401207104 0.828860666 0.094734978 0.998390905 0.761376766 0.544001075 0.901412357 0.611515683
26  1   NA  NA  2   1   0.650375963 0.82854139  0.678481275 0.053565344 0.725918141 0.462696627 0.781661878 0.247926698 0.896495716 0.067714926 0.854996151 0.007778748 0.087166199 0.162193333 0.337942796 0.924925652 0.629788632 0.199940498 0.394249739 0.296213669
34  1   NA  NA  2   1   0.550807858 0.422672911 0.975977621 0.686356795 0.161541393 0.51490188  0.206613536 0.042012755 0.625714656 0.260060599 0.920103236 0.995255399 0.155289084 0.361658753 0.911763522 0.671250837 0.993388857 0.390214068 0.945968449 0.274847887
42  1   NA  NA  2   1   0.934880255 0.920203832 0.432055682 0.598642825 0.175905258 0.533883496 0.002016901 0.001015627 0.14724496  0.655515358 0.659772253 0.102383326 0.59884333  0.949273788 0.656322346 0.87928498  0.676120876 0.834748556 0.657029437 0.877257774
4

3 回答 3

3

您应该直接解决默认行为,而不是根据所选列的数量对同一操作使用多个函数。?`[`通知过程说,“结果被强制到可能的最低维度”,这意味着如果有一列被子集化,它将被强制为向量。我们可以用 取消效果drop=FALSE。例子:

rowSums(impact[, 15, drop=FALSE])

#Or subset without commas
rowSums(impact[15])

与以编程方式使用时更改使用的函数相比,这是有利的,我们可以15用任何索引替换子集:

col_seq <- 1:ncol(impact)
indx <- sample(col_seq, sample(col_seq), replace=TRUE)
rowSums(impact[indx])

更新

让我们用另一个例子进一步解释原因:

df <- head(mtcars)
df[10:11]
#                  gear carb
#Mazda RX4            4    4
#Mazda RX4 Wag        4    4
#Datsun 710           4    1
#Hornet 4 Drive       3    1
#Hornet Sportabout    3    2
#Valiant              3    1

如果我们想获得这个子集的行总和,我们有几个选择。请记住行总和是什么,每行的总和(即4+4 4+4 4+1 3+1 ...):

rowSums(df[10:11])
        Mazda RX4     Mazda RX4 Wag        Datsun 710    Hornet 4 Drive Hornet Sportabout           Valiant 
                8                 8                 5                 4                 5                 4 

让我们验证答案是否正确:

all(rowSums(df[10:11]) == df[10] + df[11])
[1] TRUE

如果我们有一列,那么行总和就是列本身:

df[10]
#                  gear
#Mazda RX4            4
#Mazda RX4 Wag        4
#Datsun 710           4
#Hornet 4 Drive       3
#Hornet Sportabout    3
#Valiant              3

我们可以问,这个子集的行和是多少?它与另一个定义相同,即每一行的总和。但在这种情况下,我们可以只返回列本身。

为什么我们rowSums在这里甚至不需要它时也要使用它?因为有时我们正在以编程方式构建函数。我们可能事先不知道索引的长度为 1。如果我们有一个函数可以求和,不管它是多列还是一列,我们就可以编程而不用担心索引的长度:

all(rowSums(df[,10, drop=FALSE]) == df[10])
[1] TRUE
于 2016-04-12T14:13:25.207 回答
2

这里的问题是您试图rowSums仅采用列向量。

test_matrix <- matrix(1, nrow = 3, ncol = 2)

如果我们在这里只抓取第二列,我们最终只会得到一个向量。

test_matrix[,2]

[1] 1 1 1

您不能采用rowSums向量的 ,这就是您收到错误的原因。您实际上是在告诉 R 仅获取第 15 列中的数据(给您一个数字向量,尝试一下class(impact[,15]),您会发现这是真的),然后尝试将其放入rowSums需要矩阵(而不是向量)的函数中)。如果您只想要第 15 列的总和,那么您只需取该子集的总和(即sum(impact[,15])。

于 2016-04-12T13:50:34.440 回答
0

单列的行总和只是该列本身的值。

因此,impact[, 15]就是你想要的。

如果你想要那一列的总和,sum(impact[, 15])就是你想要的。

于 2016-04-12T13:50:49.873 回答