R错误:"在数值表达式中有19个元素:只使用了第一个"。

8

我创建了一个数据框:

totalDeposit <- cumsum(testd$TermDepositAMT[s1$ix])

这基本上是计算testd数据框中TermDeposit金额的累积总和,并将其存储在totalDeposit中。这个部分完美地执行了。

然后,我需要计算存款金额的平均值,我使用以下代码:

avgDeposit <- totalDeposit / (1:testd)

但是我收到了一个错误消息:

1:testd中的错误:NA / NaN参数
此外:警告消息:
在1:testd中:数值表达式有19个元素:仅使用第一个元素

testd有大约8000个观测值和19个变量。

有没有人可以帮助我解决这个问题?我试图在网上找到这个错误消息,但迄今为止我所理解的就是1:testd基本上使R将testd读取为一个数字,而它不是一个数字,因此我收到一个错误消息。仅仅采用mean(totalDeposit)会奏效吗?我尝试了一下,但得出的数字荒谬,根本不能代表平均值。

感谢您的帮助。


1
似乎您还有一些数据丢失。 - Fernando
表达式a:b要求ab都是标量(即单个元素)。而你的testd不止一个。你可能想要使用totalDeposit/(1:length(totalDeposit)) - Carl Witthoft
谢谢。我尝试了你和Ironholds的回答,它们的输出结果相似。 - Freewill
2个回答

12

在这种情况下,错误信息是有帮助的。

当你说1:N时,你告诉R“给我介于1和N之间的整数序列”。它是从整数1到整数2。 testd不是一个整数,它(最多)是一个整数向量,因此在计算序列时,R会处理除testd中第一个值以外的所有值。否则,将会出现可怕的错误或一组序列 - 一个在1和testd中第一个值之间,另一个在1和testd中第二个值之间......以此类推。

相反,如果testd是数据框,则需要使用1:nrow(testd),如果它是列表或向量,则需要使用1:length(testd)seq_along(testd)

基于这个问题,虽然需要计算平均值?但你实际上是错误的,因为你不想要一个数值序列,你只需要一个:因为平均值=总和/元素数量,所以你只需要“元素数量”- 可以通过nrow(testd)简单地检索。

谢谢。我也尝试了通过nrow(testd)来进行简单的分割,当然它获得的值与1:nrow(testd)不同。您能否帮助我概念上理解R在处理1:nrow(testd)与nrow(testd)时的区别?非常感谢。 - Freewill
1
nrow(testd)是一个单独的数字,而1:nrow(testd)是以1开始的数字序列。 - IRTFM
BondedDust所说的没错。1:nrow(testd)最好理解为“给我所有在1和testd行数之间的数字,包括1和testd的行数”。因此,如果testd有5行,则为1,2,3,4,5。3:nrow(testd)将是3,4,5。因此,除以nrow(testd)就是除以行数。除以1:nrow(testd)就是依次除以1到行数之间的每个整数。 - user3471268
@user3007275:请查看我上面修改过的答案;如果你要计算平均值,nrow(testd)就是你想要的。 - user3471268
再次感谢,我正在尝试预测每个观察(客户)的平均存款金额,因此我感觉需要对每一行进行平均,这就是1:nrow(testd)所能实现的,而不是nrow(testd),后者只能得到一个总体值。有一本书可以帮助我找到编码方面的一些帮助,这本书有一个类似的代码,但我并没有完全理解他们想做什么。现在它更有点意义了。 - Freewill
每个的平均值?这似乎是循环的;每一行肯定是一个单独的观察结果。单个观察结果的平均值是...嗯,就是那个观察结果的值。 - user3471268

1
很明显,由于没有从 testd$ 得到错误信息,所以可以确定 testd 是一个数据框或列表。如果你有一个 testd,其中第一个元素是数字但长度超过一个元素,那么你只会收到警告。你可能想要写成:
avgDeposit <- totalDeposit / 1:nrow(testd)

虽然我承认这似乎没有什么用处,但至少它不会引发错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接