R语言 WITHIN函数的一个BUG?

发布于 2022-09-11 16:30:35 字数 386 浏览 26 评论 0

题目描述

R语言 WITHIN函数的一个BUG?

题目来源及自己的思路

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

相关代码

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

荭秂 2022-09-18 16:30:35

比较优雅的方式:

f %>%
mutate( b = case_when( 
        b %>% between(1000,3000) ~ "B",
        b %>% between(3000,9999.9) ~ "A"
        TRUE ~ b
)
浅听莫相离 2022-09-18 16:30:35

每一次赋值时,自动将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

夜巴黎 2022-09-18 16:30:35

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文