由于错误消息,我变得疯狂了。我完全使用了脚本,但是使用了另一个矩阵,我无法再计算出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
答案 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])
就是您想要的。