首页 > 解决方案 > 如何使 R 停止接受列名的部分匹配?

问题描述

我最近在查找代码中的错误时遇到了困难——结果发现我引用了一个不存在的列,但 R 没有给我任何关于引用不存在的列的错误或警告。相反,因为我引用的不存在的列恰好与另一列名称的开头匹配,所以 R 默默地替换了另一列。

我发现这是一种非常不受欢迎的行为——R 怎么称呼它,我该如何关闭它?

例子:

> a <- as.data.frame(cbind(rep(0,5),rep(2,5),seq(58,62)))
> colnames(a) <- c('eligible','height','age_of_death')
> a
  eligible height age_of_death
1        0      2           58
2        0      2           59
3        0      2           60
4        0      2           61
5        0      2           62
> a$he
[1] 2 2 2 2 2
> a$eligible[a$age >= 60] <- 1
> a
  eligible height age_of_death
1        0      2           58
2        0      2           59
3        1      2           60
4        1      2           61
5        1      2           62

不确定是否所有版本的 R 都这样做,但我使用的是 3.6.0。

如何禁用此功能,以便 R 会告诉我是否引用了一个不存在的列,而不是尝试为我替换一个名称相似的列?

标签: rdataframe

解决方案


转换a为 tibble 似乎会引发警告消息,不确定这是否足以满足您的需求

library(dplyr)
a < - as_tibble(a)
a$eligible[a$age >= 60] <- 1
# Warning message:
# Unknown or uninitialised column: 'age'.

如果您不熟悉 tibbles,可以查看此处的文档。

编辑:另一种解决方案似乎使用括号符号而不是美元

a$eligible[a["age"] >= 60] <- 1
# Error in `[.data.frame`(a, "age") : undefined columns selected

推荐阅读