【问题标题】:Error - replacement has [x] rows, data has [y]错误 - 替换有 [x] 行,数据有 [y]
【发布时间】:2015-07-01 03:14:19
【问题描述】:

我在数据框 ("df") 中有一个数值列 ("value"),我想根据 "value" 生成一个新列 ("valueBin")。我有以下条件代码来定义 df$valueBin:

df$valueBin[which(df$value<=250)] <- "<=250"
df$valueBin[which(df$value>250 & df$value<=500)] <- "250-500"
df$valueBin[which(df$value>500 & df$value<=1000)] <- "500-1,000"
df$valueBin[which(df$value>1000 & df$value<=2000)] <- "1,000 - 2,000"
df$valueBin[which(df$value>2000)] <- ">2,000"

我收到以下错误:

"$&lt;-.data.frame(*tmp*, "valueBin", value = c(NA, NA, NA, : 替换有6530行,数据有6532"

df$value 的每个元素都应该适合我的which() 语句之一。 df$value 中没有缺失值。尽管即使我只运行第一个条件语句 ("...replacement has 6530 rows..." 尽管 value

此 SO 链接在使用 aggregate() 时指出类似错误是一个错误,但它建议安装我拥有的 R 版本。加上错误报告说它已修复。 R aggregate error: "replacement has <foo> rows, data has <bar>"

这个 SO 链接似乎与我的问题更相关,这里的问题是他/她的条件逻辑问题,导致生成的替换数组的元素更少。我想这也一定是我的问题,起初我认为我必须有一个“R error in '[<-.data.frame'... replacement has # items, need #

【问题讨论】:

  • 您需要遵循@akrun 所说的并使用cut。但是,如果您想使用您的方法,请先初始化新列而不是给出您的命令:df$valueBin&lt;-"",然后是其他分配。

标签: r dataframe


【解决方案1】:

@akrun 的回答确实有效。对于想了解原因的未来谷歌人,这里有一个解释......

需要先创建新变量。

变量“valueBin”需要已经在 df 中才能使条件赋值起作用。本质上,代码的语法是正确的。只需在代码chuck前面添加一行即可创建此名称--

df$newVariableName <- NA

然后您继续使用您拥有的任何条件分配规则,例如

df$newVariableName[which(df$oldVariableName<=250)] <- "<=250"

我责怪编写该软件包错误消息的人...该错误消息使调试变得特别混乱。您在 df 中有两个长度不同的数组是无关紧要的信息。不,只需先创建新列。更多详情,请参阅本帖https://www.r-bloggers.com/translating-weird-r-errors/

【讨论】:

  • upvote 没有表达对最后一段的足够感谢。
【解决方案2】:

你可以使用cut

 df$valueBin <- cut(df$value, c(-Inf, 250, 500, 1000, 2000, Inf), 
    labels=c('<=250', '250-500', '500-1,000', '1,000-2,000', '>2,000'))

数据

 set.seed(24)
 df <- data.frame(value= sample(0:2500, 100, replace=TRUE))

【讨论】:

  • 嘿,非常感谢。仍然不确定我的原始代码有什么问题,但这绝对更干净,并且有效。
  • @MaxPower 很高兴知道它有效。正如 nicola 在 cmets 中提到的,当您将 valueBin 分配给子集(基于条件)而不首先将 valueBin 创建为 ''NA 时,将导致长度错误
  • @akrun 知道为什么会出现如此特殊的长度错误吗?如果我们使用 R 的 length() 函数进行调查,valueBin 向量的长度不是为 0 吗?
  • @akrun 这个问题有大约 27K 的浏览量,这个错误很常见。您能否编辑并添加他们收到错误的原因。您的解决方案当然有效,但最好能解释一下 OP 为何出现错误。
  • @zx8754 我认为下面有一个答案可以解释原因。我一定没有正确阅读评论
【解决方案3】:

TL;DR ...迟到了,但简短的解释可能会对未来的谷歌人有所帮助..

通常,该错误消息意味着 替换 不适合数据框的相应列。

一个最小的例子:

df <- data.frame(a = 1:2); df$a <- 1:3

抛出错误

$&lt;-.data.frame(*tmp*, a, value = 1:3) 中的错误:替换 有 3 行,数据有 2 行

这很清楚,因为 df 的向量 a 有 2 个条目(行),而我们尝试替换的向量有 3 个条目(行)。

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多