如何修复R错误:$运算符对原子向量无效

1,459 阅读2分钟

在过去的几年里,R在数据科学家和统计学家中得到了普及。流行的R包是经过严格的测试后开发的,并返回错误信息,有更多的解释,这对R的新手用户来说很容易理解。在基础R中,最常遇到的错误之一是 $ operator is invalid for atomic vectors

背景介绍

当你试图使用$ 操作符使用原子向量的一个元素时,这个错误就会出现。让我们把原子向量称为字符/数字向量,这是大多数R程序员所熟悉的。还有两种类型的原子向量--逻辑和整数。

让我们通过例子来理解它。请看下面的例子

# Numeric Vector
numVec <- c(3, 2.5, 5.6)

# Character Vector
charVec <- c("Hello", "GroupA")

# Integer Vector
intVec <- c(2L, 4L, 11L)

# Logical Vector
logicalVec <- c(TRUE, FALSE, T, F) 

你可以通过以下方法检查一个向量是否是原子向量 **is.atomic(numVec)**.如果它是一个原子向量,则返回TRUE,否则返回FALSE。

让我们使用names() 函数来命名数字向量。

names(numVec) <- c('A', 'B', 'C')

numVec
  A   B   C 
3.0 2.5 5.6 

当我们试图使用美元$ 操作符通过名称A 来访问第一个值时,它返回这个错误。

numVec$A
Error in numVec$A : $ operator is invalid for atomic vectors

我们有三种方法可以解决这个错误。

解决方案1:使用双括号

我们可以使用双括号[[ ]] ,从一个原子向量中按名称访问元素。请确保在名称中使用引号,因为它是一个字符串。

numVec[['A']]

[1] 3 

我们不能使用单括号吗?

是的,我们可以使用单括号[ ] 来完成这个任务,但是输出的格式会有所不同。它返回命名的数字,而不仅仅是数字。请参考下面的输出结果。

getElement(numVec, 'A')

[1] 3

我们可以像这样删除名称unname(numVec['A']) 。因此,最好使用双括号,因为单括号会使事情复杂化,除非你想要命名的数字。

解决方案2:使用getElement( )

getElement( ) 遵循这种语法风格 -getElement(object, name) 。它只为这种问题陈述而设计。

getElement(numVec, 'A')

解决方案3:转换为数据框架

这不是一个推荐的解决方案,但我们的目的是向你展示另一种方法来解决这个问题,使用data.frame( ) 。我们需要在将向量包裹在data.frame( )中之前进行转置,因为我们需要将数据存储在单行中,将向量的名称作为列名,而不是3行。

myDF <- data.frame(t(numVec))
myDF$A

[1] 3