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
由于错误消息,我快疯了。我完全使用了脚本,但使用了另一个矩阵,我无法再计算行和。
我收到了这条烦人的错误消息:
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