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

Max*_*wer 34 r dataframe

我在数据框("df")中有一个数字列("值"),我想根据"值"生成一个新列("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"
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

"错误$<-.data.frame(*tmp*,"valueBin",值= c(NA,NA,NA,:替换有6530行,数据有6532"

每个元素df$value都应符合我的一个which()陈述.没有遗漏的值df$value.虽然我只运行第一个条件语句(<= 250),但我得到完全相同的错误,"...replacement has 6530 rows..."尽管有少于6530条记录值<= 250,而值永远不是NA.

当使用aggregate()是一个bug时,这个SO链接注意到类似的错误,但它建议安装RI版本.此外,错误报告称其已修复. R聚合错误:"替换有<foo>行,数据有<bar>"

这个SO链接似乎与我的问题更相关,这里的问题是他/她的条件逻辑的问题导致更换数组的元素生成更少.我想这也一定是我的问题,并且首先想到我必须有一个"<="而不是"<",反之亦然,但在检查后我很确定它们都是正确的,以涵盖每个值"价值"没有重叠. '[< - .data.frame'中的R错误...替换有#项,需要#

Rac*_*nny 51

@akrun的答案肯定能解决问题.对于想要了解原因的未来googlers,这里有一个解释......

需要首先创建新变量.

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

df$newVariableName <- NA
Run Code Online (Sandbox Code Playgroud)

然后你继续你有的任何条件分配规则,比如

df$newVariableName[which(df$oldVariableName<=250)] <- "<=250"
Run Code Online (Sandbox Code Playgroud)

我责怪谁写了那个包的错误信息......调试因错误信息而特别混淆.在df中有两个不同长度的数组是无关紧要的信息.不.只需先创建新列.有关详细信息,请参阅此帖子https://www.r-bloggers.com/translating-weird-r-errors/

  • upvote对最后一段没有得到足够的感谢. (5认同)

akr*_*run 15

你可以用 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'))
Run Code Online (Sandbox Code Playgroud)

数据

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

  • @MaxPower很高兴知道它有效.正如评论中提到的nicola,当你将`valueBin`分配给一个子集(基于条件)而没有首先将`valueBin`创建为`''或`NA`时,它将导致长度错误 (2认同)
  • @akrun这个问题大约有27K的视图,并且这个错误很常见。您能否编辑并添加他们遇到错误的原因。您的解决方案当然有效,但是最好能解释一下OP出错的原因。 (2认同)

sym*_*ush 7

TL;DR ...虽然迟到了,但是这个简短的解释可能会对未来的谷歌用户有所帮助。

一般来说,该错误消息意味着替换不适合数据帧的相应列。

一个最小的例子:

df <- data.frame(a = 1:2); df$a <- 1:3
Run Code Online (Sandbox Code Playgroud)

抛出错误

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

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