我在数据框("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/
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)
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 个条目(行)。
归档时间: |
|
查看次数: |
122133 次 |
最近记录: |