我继承了一些遗留的R代码来处理该代码,该代码基于同一行中的某个其他列中的值重新编码列中的某些值这被误认为是时,在现实中,这些值实际上是(字符串转换为)的因素,像这样一个布尔值:R:意外地使用因子列对数据框进行子集化,就好像它是逻辑的一样
df <- data.frame(value = c(1, 2, 3, 4, 5, 6),
reversed = c("true", "false",
"true", "true",
"false", "false"))
str(df)
#> 'data.frame': 6 obs. of 2 variables:
#> $ value : num 1 2 3 4 5 6
#> $ reversed: Factor w/ 2 levels "false","true": 2 1 2 2 1 1
df$recoded_value <- df$value
df$recoded_value[df$reversed] <- 7 - df$recoded_value[df$reversed]
如果检查的结果,这将产生意外的结果。 df[2, "recoded_value"]
是5,但意图是它是2.此外,df[3, "recoded_value"]
是3,但意图是它为4.
我想了解这里发生了什么。我的第一个假设是R将一个因子水平作为TRUE
,另一个作为FALSE
。但是,这显然并非如此,因为相同的因素水平不被同等对待:
df[c(1,3), ]
#> value reversed recoded_value
#> 1 1 true 6
#> 3 3 true 3
df[c(2,5), ]
#> value reversed recoded_value
#> 2 2 false 5
#> 5 5 false 5
这到底是怎么回事?
澄清:我对问题的解决方案不感兴趣。我知道如何修复代码以产生预期的结果。我想了解:
- 为什么此代码可以工作?你如何基于因子列进行子集划分?什么是
`[`
甚至允许这样做? - 为什么相同价值的东西(,即,相同水平的因素)被区别对待?
感谢您的回答!不知道为什么我以前没有意识到这一点。我认为在构建最简单的例子时我选择了糟糕的数字;我不应该选择与行号相同的值。 ':-p'无论如何,谢谢。 +1 –