R语言中使用row.names的ifelse将行号视为非整数问题
问题分析
你猜的没错,row.names(summary)返回的是字符型向量,R中字符比较是按字典序进行的。比如字符"10"和"3"比较时,会优先对比首字符"1"和"3",由于"1"的ASCII码小于"3",所以"10"<="3"会返回TRUE——这就导致行名字符为"10"到"29"的行都被误判为符合条件,最终赋值成"Dogs",和你的预期不符。
解决方法
以下几种方式都能规避字符比较的坑,基于数值型行索引实现精准判断:
方法1:直接使用数值行号(最推荐)
用1:nrow(summary)获取数据框的整数行号,直接和3做数值比较:
ParticipantNum <- c(1,2,4,5,7,8,9,10,13,15,16,17,18,22,24,26,27,28,29,30,32,33,35,36,39,41,43,44,45,49,50,53,54) ParticipantTime <- c(55,54,56,88,54,79,64,52,48,21,54,87,62,35,54,87,96,96,87,53,54,52,32,89,11,28,47,78,22,14,49,75,45) summary <- data.frame(Number=ParticipantNum,Time=ParticipantTime,Category='') summary$Category <- ifelse(1:nrow(summary) <= 3, "Dogs", "Cats")
如果担心数据框行数为0的情况,也可以用更安全的seq_len(nrow(summary))替代1:nrow(summary)。
方法2:将行名转为整数后比较
如果你一定要基于行名操作,先把字符型行名转为整数再做比较:
summary$Category <- ifelse(as.integer(row.names(summary)) <= 3, "Dogs", "Cats")
方法3:直接赋值指定行(更直观)
对于前N行赋值的需求,也可以不用ifelse,先统一设置默认值,再修改目标行:
summary$Category <- "Cats" # 先将所有行设为Cats summary$Category[1:3] <- "Dogs" # 再把前3行改为Dogs
以上方法都能精准实现:第1-3行的Category为"Dogs",其余行为"Cats"。
内容的提问来源于stack exchange,提问作者Spurtacas
相关产品推荐
相关产品推荐

