在过去的几年里,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