R语言 WITHIN函数的一个BUG?

题目描述

R语言 WITHIN函数的一个BUG?

题目来源及自己的思路

用within函数分类时发现的问题

相关代码

似乎没法显示正确R代码,只好贴图了。
图片描述

你期待的结果是什么?实际看到的错误信息又是什么?

第一次 + b[b>3000 & b<=9999.9]<-"A"
第二次 + b[b>3000 & b<=10000.0]<-"A"
仅增加了0.1,分类就无法获得正确结果。
各位大神看看,是不是R语言WITHIN函数的BUG?

阅读 3.9k
3 个回答

主要是R的比较操作符和其他语言相比有点奇怪。

within(f, {
  b[b > 1000 & b <= 3000] <- "B"
  b[b > 3000 & b <= 9999.9] <- "A"
})

花括号第一步会隐式地将b转为字符串向量,字符串向量的比较操作符可见参考文档:https://www.rdocumentation.or...

比较优雅的方式:

f %>%
mutate( b = case_when( 
        b %>% between(1000,3000) ~ "B",
        b %>% between(3000,9999.9) ~ "A"
        TRUE ~ b
)
新手上路,请多包涵

每一次赋值时,自动将f$b转成了character

f <- data.frame(a = c(1,2,3,4,5,6), b = c(4400,2220,3080,3140,0,1150))

f
a b
1 1 4400
2 2 2220
3 3 3080
4 4 3140
5 5 0
6 6 1150

f <- within(f,{

  • b[b > 1000 & b <= 3000] <- "B"
  • })
f
a b
1 1 4400
2 2 B
3 3 3080
4 4 3140
5 5 0
6 6 B

summary(f)

   a             b            

Min. :1.00 Length:6
1st Qu.:2.25 Class :character
Median :3.50 Mode :character
Mean :3.50
3rd Qu.:4.75
Max. :6.00

within(f,{
  • b[b > 3000 & b <= 10000.0] <- "A"
  • })
    a b

1 1 4400
2 2 B
3 3 3080
4 4 3140
5 5 0
6 6 B

"4400" <= 10000.0
[1] FALSE

"4400" <= 9999.9
[1] TRUE

f <- data.frame(a = c(1,2,3,4,5,6), b = c(4400,2220,3080,3140,0,1150))

f
a b
1 1 4400
2 2 2220
3 3 3080
4 4 3140
5 5 0
6 6 1150

f <- within(f,{

  • b[b > 1000 & b <= 3000] <- 1
  • })
f
a b
1 1 4400
2 2 1
3 3 3080
4 4 3140
5 5 0
6 6 1

summary(f)

   a              b       

Min. :1.00 Min. : 0
1st Qu.:2.25 1st Qu.: 1
Median :3.50 Median :1540
Mean :3.50 Mean :1770
3rd Qu.:4.75 3rd Qu.:3125
Max. :6.00 Max. :4400

within(f,{
  • b[b > 3000 & b <= 10000.0] <- 2
  • })
    a b

1 1 2
2 2 1
3 3 2
4 4 2
5 5 0
6 6 1

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进