rowSums - 由于数组导致的错误

时间:2016-04-12 13:41:34

标签: r rowsum

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

我收到了这个恼人的错误消息:

  

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

3 个答案:

答案 0 :(得分:3)

您应该直接解决默认行为,而不是根据所选列的数量对同一操作使用多个函数。 ?`[`通知进程说,&#34;结果被强制转换为最低可能维度&#34;,表示如果有一个列被子集化,则它将被强制转换为向量。我们可以使用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

答案 1 :(得分: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])。

答案 2 :(得分:0)

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

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

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