R 应用于值向量的简单逻辑测试中的困惑行为

R 应用于值向量的简单逻辑测试中的困惑行为,r,R,好吧,这让我非常困惑和担心- 作为常规工作的一部分,我一直在根据变量值是否高于或低于/等于中值,将变量的单个观察值分类为TRUE或FALSE。然而,我在R中得到了一个行为,这在执行这个简单的测试时基本上是出乎意料的 因此,以这组观察结果为例: data=c(0.6666667, 0.8333, 0.6666667, 0.8333, 0.8333, 0.75, 0.9999, 0.7499667, 0.25, 0.6666667, 0.1667, 0.7499667, 0.5, 0.2500333

好吧,这让我非常困惑和担心- 作为常规工作的一部分,我一直在根据变量值是否高于或低于/等于中值,将变量的单个观察值分类为
TRUE
FALSE
。然而,我在R中得到了一个行为,这在执行这个简单的测试时基本上是出乎意料的

因此,以这组观察结果为例:

data=c(0.6666667, 0.8333, 0.6666667, 0.8333, 0.8333, 0.75, 0.9999, 0.7499667, 0.25, 0.6666667, 0.1667, 0.7499667, 0.5, 0.2500333, 0.3333667, 0.0834, 0.0001, 0.2500333, 0.8333, 0.9999, 0.9999, 0.2500333, 0.2500333, 0.3333667, 0.9166, 0.5, 0.2500333, 0.4166667, 0.0001, 0.1667333, 0.6666333, 0.0834, 0.1667, 0.6666333, 0.9166, 0.1667, 0.7499333, 0.9166, 0.9166, 0.9166, 0.7499667, 0.7499667, 0.4166667, 0.5, 0.2500333, 0.9166, 0.6666667, 0.1667333, 0.25, 0.0001, 0.3333667, 0.0001, 0.25, 0.0834, 0.9999, 0.0834, 0.1667, 0.5, 0.2500333, 0.3333667, 0.9166, 0.9166, 0.8333, 0.9166, 0.75, 0.0834, 0.4166667, 0.5, 0.0001, 0.9999, 0.8333, 0.6666667, 0.9166)
为了对这些值进行分类,我做了:

data_med=median(data)
quant_data=data
quant_data[quant_data>data_med]="High"
quant_data[quant_data<=data_med]="Low"
参见“1e-04”中的内容?更奇怪的是,让我们选择值69,返回奇数值的值之一:

data[69]
>1e-04
如果我单独测试这个值,我会得到我期望得到的结果:

data[69]<=data_med
TRUE

data[69]让我们来看看你在这里做了什么

data=c(0.6666667, 0.8333, 0.6666667, 0.8333, 0.8333, 0.75, 0.9999, 0.7499667, 0.25, 0.6666667, 0.1667, 0.7499667, 0.5, 0.2500333, 0.3333667, 0.0834, 0.0001, 0.2500333, 0.8333, 0.9999, 0.9999, 0.2500333, 0.2500333, 0.3333667, 0.9166, 0.5, 0.2500333, 0.4166667, 0.0001, 0.1667333, 0.6666333, 0.0834, 0.1667, 0.6666333, 0.9166, 0.1667, 0.7499333, 0.9166, 0.9166, 0.9166, 0.7499667, 0.7499667, 0.4166667, 0.5, 0.2500333, 0.9166, 0.6666667, 0.1667333, 0.25, 0.0001, 0.3333667, 0.0001, 0.25, 0.0834, 0.9999, 0.0834, 0.1667, 0.5, 0.2500333, 0.3333667, 0.9166, 0.9166, 0.8333, 0.9166, 0.75, 0.0834, 0.4166667, 0.5, 0.0001, 0.9999, 0.8333, 0.6666667, 0.9166)



data_med=median(data)  ## 0.5
quant_data=data        ## irrelevant
quant_data[quant_data>data_med]="High"
但这样做将量化数据转换为字符向量

str(quant_data)
##  chr [1:73] "High" "High" "High" "High" "High" "High" "High" ...
现在,字符值和
data\u-med
值之间的比较几乎没有意义,因为
data\u-med
也将被强制为字符值:

"High" < "0.5"  ## FALSE
"1e-4" < "0.5"  ## FALSE -- this is your problem.
quant_data[quant_data<=data_med]="Low"

正如@Arun在上面的评论中指出的那样,
quant\u data\u med,“高”、“低”)
也会起作用。因此,适当使用
cut()

是否会删除这一行:
quant\u data=data
并在
[.
,然后尝试您的代码。您正在将
High
分配给一个数值向量,该向量将替换为
字符向量
。在分配
High
后检查当前输出,以更好地了解发生了什么。完成此任务的一个相对较好的方法是使用
ifelse
进行示例:
quant\data data med,“高”、“低”)
我没有删除quant_data=data,或者我没有为测试分配空间,但您的第二个建议明确了这一点-问题是,一旦我执行第一个逻辑测试,quant_数据中的所有值都被分配为字符(例如,“高”“0.25”“高”“0.1667”“1e-04”).R似乎仍然会对具有简单数字格式的字符串应用逻辑测试,但不会对科学记数法中带有数字的字符串应用逻辑测试。我几乎更希望它只是给了我一个错误,让我不做这种愚蠢的事情…@Lucas,避免使用“错误行为”之类的短语我同意@Roland的观点,即这可能是引发否决票的语言,尽管帖子本身的文本是完全合理的(也就是说,它的措辞是“我不明白发生了什么”,而不是“R一定在做错事/蠢事”)实际上,
quant_data它没有转换成数字,只是字典排序(见我上面的评论)恰好给了你正确的答案。谢谢Ben!我是你的UF生态模型和数据课程的前学生。
"High" < "0.5"  ## FALSE
"1e-4" < "0.5"  ## FALSE -- this is your problem.
quant_data[quant_data<=data_med]="Low"
quant_data[data>data_med]="High"
quant_data[data<=data_med]="Low"
table(quant_data)
## High  Low 
##   35   38