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