我在数据框(“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"
我收到以下错误:
“
$<-.data.frame
中的错误(*tmp*
,”valueBin“,值= c(NA,NA,NA,: 替换有6530行,数据有6532“
df$value
的每个元素都应该适合我的一个which()
语句。 df$value
中没有缺失值。虽然即使我只运行第一个条件语句(&lt; = 250),但我得到了完全相同的错误,"...replacement has 6530 rows..."
虽然有少于6530条记录值<&lt; = 250,但值绝不是NA。
当使用aggregate()是一个bug时,这个SO链接注意到类似的错误,但它建议安装我拥有的R版本。此外,错误报告称其已修复。 R aggregate error: "replacement has <foo> rows, data has <bar>"
这个SO链接似乎与我的问题更相关,这里的问题是他/她的条件逻辑的问题导致更换数组的元素生成更少。我想这也一定是我的问题,并且首先想到我必须有一个“&lt; =”而不是“&lt;”反之亦然,但经过检查后我很确定它们都是正确的,可以覆盖“价值”的每一个值,而不会重叠。 R error in '[<-.data.frame'... replacement has # items, need #
答案 0 :(得分:38)
@akrun的答案肯定能解决问题。对于想要理解原因的未来googlers,这里有一个解释......
首先需要创建新变量。
变量“valueBin”需要已经在df中才能使条件赋值工作。本质上,代码的语法是正确的。只需在代码卡盘前添加一行即可创建此名称 -
df$newVariableName <- NA
然后继续使用您拥有的任何条件分配规则,例如
df$newVariableName[which(df$oldVariableName<=250)] <- "<=250"
我责怪谁写了那个包的错误信息......调试因错误信息而特别令人困惑。在df中有两个不同长度的数组是无关紧要的信息。不。只需先创建新列。有关详细信息,请参阅此帖https://www.r-bloggers.com/translating-weird-r-errors/
答案 1 :(得分: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'))
set.seed(24)
df <- data.frame(value= sample(0:2500, 100, replace=TRUE))
答案 2 :(得分:0)
TL; DR ...,而且晚点参加,但是简短的解释可能会对将来的Google员工有所帮助。
通常,错误消息表示替换不适合数据框的相应列。
一个最小的例子:
df <- data.frame(a = 1:2); df$a <- 1:3
引发错误
$<-.data.frame
(*tmp*
中的错误,a,值= 1:3):替换 有3行,数据有2
这很清楚,因为a
的向量df
有2个条目(行),而我们尝试替换的向量有3个条目(行)。