逻辑不基于R中的阈值过滤值列表

时间:2018-04-03 03:48:08

标签: r

我有一个非常简单的问题,我不知道如何解决。

转换前我有以下非常小的值列表:

                  [,1]
V8530 0.00000009686643
V6196 0.00297853602192
V714  0.99999999760977
V9461 0.00003742696819
V9518 0.00141335323766
V9511 0.00047082401517
V9651 0.00011655255640
V6358 0.00000056338519
V5930 0.00000155667916

如果值> gt; 0.09然后我想将其转换为0.如果该值小于0.09,我想将值替换为1.

转换逻辑

  predicted_train_0_1[predicted_train_0_1 < 0.09] <- 1
  predicted_train_0_1[predicted_train_0_1 > 0.09] <- 0

这些是转换后的值:

  [,1]
V8530    0
V6196    0
V714     0
V9461    0
V9518    0
V9511    0
V9651    0
V6358    0
V5930    0

我可能需要睡觉或其他什么,但我无法弄明白为什么!?逻辑似乎太简单了,不能错误恕我直言。

任何帮助都非常受欢迎。

谢谢!

2 个答案:

答案 0 :(得分:3)

这是bug的常见来源。当您对变异的对象使用逻辑测试时,您必须记住测试结果将发生变化。这里有各种各样的解决方案,但总体思路是在测试输入发生变化之前将测试结果存储在另一个对象中。

最基本的解决方案:

ifelse

TRUE在幕后执行此操作,只需更多错误检查。

正如@thelatemail指出的那样,因为您恰好将index中的1值转换为FALSE,将0值转换为index,例如,只需使用x <- c(0.00000009686643, 0.00297853602192, 0.99999999760977, 0.00003742696819, 0.00141335323766, 0.00047082401517, 0.00011655255640, 0.00000056338519, 0.00000155667916) 即可获得更好的服务。

数据:

{{1}}

答案 1 :(得分:0)

您的第一个逻辑 predicted_train_0_1[predicted_train_0_1 < 0.09] <- 1 返回的向量为1,值为&gt; 0.09。因此,第二个逻辑将返回所有0的列表。

我的解决方案是使用dplyr库:

library("dplyr")

x <- x %>% mutate(
  predicted_train = if_else(val > 0.9, 0, 1)
)

以下是x

x <- data.frame(val=c(0.00000009686643,
                  0.00297853602192, 
                  0.99999999760977, 
                  0.00003742696819, 
                  0.00141335323766,
                  0.00047082401517,
                  0.00011655255640))