我有一个数据框架,如:

a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)

我试着用下面的方法将其中一列转换为一个向量,但它不起作用:

avector <- as.vector(aframe['a2'])
class(avector) 
[1] "data.frame"

这是我能想到的唯一解决方案,但我认为一定有更好的方法:

class(aframe['a2']) 
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"

注:以上词汇可能不正确,请指正。我还在学习r的世界,此外,任何关于这里发生的事情的解释都是非常感谢的(例如,与Python或其他语言有关会有帮助!)


当前回答

另一种选择是使用as。矩阵与as.vector。这可以用于一列,但如果您想将所有列转换为一个向量,也可以这样做。下面是一个可重复的例子,首先将一列转换为一个向量,然后将完整的数据帧转换为一个向量:

a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)

# Convert one column to vector
avector <- as.vector(as.matrix(aframe[,"a2"]))
class(avector)
#> [1] "numeric"
avector
#> [1]  6  7  8  9 10

# Convert all columns to one vector
avector <- as.vector(as.matrix(aframe))
class(avector)
#> [1] "numeric"
avector
#>  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

于2022-08-27使用reprex v2.0.2创建

其他回答

你可以尝试这样做-

as.vector(unlist(aframe$a2))
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
avector <- as.vector(aframe['a2'])

avector<-unlist(avector)
#this will return a vector of type "integer"

现在有一种使用dplyr的简单方法。

dplyr::pull(aframe, a2)

我将尝试在不犯任何错误的情况下解释这一点,但我打赌这将在评论中引起一两个澄清。

数据帧是一个列表。当您使用列的名称和[来子集一个数据帧时,您得到的是一个子列表(或子数据帧)。如果你想要实际的原子列,你可以使用[[,或者有点令人困惑的(对我来说)你可以使用aframe[,2],它返回一个向量,而不是子列表。

所以试着运行这个序列,也许事情会更清楚:

avector <- as.vector(aframe['a2'])
class(avector) 

avector <- aframe[['a2']]
class(avector)

avector <- aframe[,2]
class(avector)
as.vector(unlist(aframe['a2']))