错误 - 替换有[x]行,数据有[y]行。

58

我有一个数据框("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"

我遇到了以下错误:

"Error in $<-.data.frame(*tmp*, "valueBin", value = c(NA, NA, NA, : replacement has 6530 rows, data has 6532"

df$value 的每个元素应该符合我的 which() 语句之一。 df$value 中没有缺失值。即使我只运行第一个条件语句(<=250),我也会得到完全相同的错误,带有 "...replacement has 6530 rows..." ,尽管小于等于250的记录要少得多,并且 value 永远不是 NA。

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

这个SO链接与我的问题更相关,这里的问题是他/她的条件逻辑导致替换数组的元素较少。我想这也一定是我的问题,起初认为可能是 "<=" 与 "<" 弄反,但检查后我相当确定它们都是正确的,可以覆盖 "value" 的每个值而没有重叠。 R error in '[<-.data.frame'... replacement has # items, need #


3
你需要遵循 @akrun 的建议并使用 cut 函数。但如果你想使用自己的方法,首先要初始化新列,然后给出命令:df$valueBin<-"",然后再进行其他的赋值操作。 - nicola
3个回答

90

@akrun的答案无疑解决了问题。对于未来希望了解原因的搜索者,以下是解释...

首先需要创建新变量。

为了使条件赋值生效,变量"valueBin"必须已经存在于df中。基本上,代码语法正确。只需在代码块前加一行以创建此名称即可。

df$newVariableName <- NA

然后您继续遵循您所拥有的任何条件分配规则,例如

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

我责怪写那个程序包错误信息的人... 那个错误信息特别混乱,让调试变得异常困难。有两个长度不同的数组在数据框中这是无关紧要的信息。不,先创建新列就可以了。更多详情请参考此帖子https://www.r-bloggers.com/translating-weird-r-errors/


11
点赞并不能充分表达对于最后一段的感谢之意。 - Chris

23

您可以使用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))

非常感谢。我仍然不确定我的原始代码有什么问题,但这肯定更简洁,而且有效。 - Max Power
2
@MaxPower 很高兴知道它能正常工作。正如nicola在评论中提到的,如果您在未将valueBin创建为''NA的情况下将其分配给子集(基于条件),则会导致长度错误。 - akrun
1
@akrun 你有什么想法,为什么会出现这样的特殊长度错误?如果我们使用R的length()函数进行调查,valueBin向量难道不只是具有长度0吗? - Kun
2
@akrun 这个问题已经有大约27K的浏览量,而且这个错误很常见。您能否编辑并添加一个原因,解释为什么他们会出现这个错误。您的解决方案肯定有效,但是如果能够解释一下OP为什么会出现这个错误,那就更好了。 - zx8754
1
@zx8754 我想下面有一个解释原因的答案。我可能没有正确地阅读评论。 - akrun

7

简而言之 ......虽然有点晚了,但这个简短的解释可能会帮助未来的谷歌搜索者。

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

一个最简示例:

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

抛出错误。

$<-.data.frame(*tmp*, a, value = 1:3) 中出现错误:替换项有3行,数据只有2行。

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


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