【问题标题】:R seems to ignore part of variable name after underscoreR 似乎在下划线后忽略了部分变量名
【发布时间】:2019-05-02 11:25:39
【问题描述】:

我在使用 R 时遇到了一个奇怪的问题。我有一个包含多个变量的数据框。我在这个数据框中添加了一个包含下划线的变量,例如:

allres$tmp_weighted <- allres$day * allres$area

在我这样做之前,R 告诉我变量 allres$tmp 不存在(这是正确的)。但是,在我将allres$tmp_weighted 添加到数据框并调用allres$tmp 后,我得到了allres$tmp_weighted 的数据。似乎下划线后面的部分对 R 来说根本不重要。我用其他几个变量/名称尝试过它,它总是这样工作

我认为这不应该像这样工作吗?我在这里忽略了什么吗?下面我将一些代码与控制台的输出一起粘贴。

# first check whether variable exists
allres_sw$Ndpsw

> NULL

#define new variable with underscore in variable name
allres_sw$Ndpsw_weighted <- allres_sw$Ndepswcrit * allres_sw$Area

#check again whether variable exists
allres_sw$Ndpsw

>   [1]    17.96480   217.50240    44.84415    42.14560     0.00000    43.14444    53.98650     9.81939     0.00000   110.67720

# this is the output that I would expect from "Ndpsw_weighted" - and indeed do get
allres_sw$Ndpsw_weighted
>   [1]    17.96480   217.50240    44.84415    42.14560     0.00000    43.14444    53.98650     9.81939     0.00000   110.67720

【问题讨论】:

  • 我和你的第一个问题有同样的问题 - R 没有读取整个变量名,它在下划线处停止,然后抱怨变量不存在(这是真的)。你解决了吗?
  • 嗨,西蒙,这听起来像是一个不同的问题 - 在我的情况下,R 从来没有识别变量的问题,只是它识别了 i> 根据变量名称的一部分识别变量(这是我没想到的行为,但在使用 $ 运算符时是可以预料到的,如下面的 Will 所述。)

标签: r variables variable-names


【解决方案1】:

在您的 R 控制台中查看 ?`[`?`$`。如果您查看extract 函数的name 参数,它指出使用$ 运算符时名称部分匹配(与`[[` 运算符相反,它使用基于exact = TRUE 参数的精确匹配)。

来自?`$`

文字字符串或名称(可能用反引号引用)。对于提取,这通常(参见“环境”部分)与对象的名称部分匹配。

【讨论】:

  • 谢谢威尔!这对我来说真的很新鲜。所以它与下划线无关(正如 Armali 也指出的那样)。
  • @Lena 是对的,它与下划线没有任何关系。
【解决方案2】:

只是为了扩展 Wil 的回答...来自help('$')

x$name

name
文字字符串或name(可能是backtick 引)。对于提取,这通常是(见下 “环境”)部分匹配names 的对象。

x$name 相当于 x[["name", exact = FALSE]]。另外,部分匹配 [[ 的行为可以使用 exact 参数来控制。

exact
控制[[ 的可能部分匹配时 通过字符向量提取(对于大多数对象,但请参见下文 “环境”)。默认为无部分匹配。价值 NA 允许部分匹配,但在匹配时会发出警告 发生。值FALSE 允许部分匹配而没有任何 警告。

这里的关键短语是部分匹配(参见pmatch)。现在您会明白下划线没有什么特别之处 - 您可以将 allres_sw$Ndpsw_weighted 缩写为 allres_sw$Ndp,前提是没有比 allres_sw$Ndepswcrit 更相似的名称。

【讨论】:

  • 感谢 Armali 的详尽回答。事实上,它与下划线无关——我看错了方向。我现在可以看到,如果我插入 allres_sw[["Ndpsw", exact = TRUE]] 我没有得到 "Ndpsw_weighted" 的结果。我可以看到部分匹配使编码更快(因为您不必输入整个变量名),但我也认为它使编码更容易出错(不小心输入错误的名称可能不会导致错误消息,因为您键入的是另一个变量的部分名称)。但我想事情就是这样。
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 2021-07-28
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2016-09-30
相关资源
最近更新 更多