rowSums - 数组错误

rowSums - error due to array

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

我收到了这条烦人的错误消息:

x must be an array of at least two dimension

我想计算矩阵影响中第 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

这里的问题是您试图获取列向量的 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])。

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

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

如果您想要该列的总和,sum(impact[, 15]) 就是您想要的。

您不应根据所选列的数量对同一操作使用多个函数,而应直接解决默认行为。 ?`[` 通知进程说 "the result is coerced to the lowest possible dimension",这意味着如果有一列被子集化,它将被强制转换为向量。我们可以用 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

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

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

all(rowSums(df[,10, drop=FALSE]) == df[10])
[1] TRUE