将data.frame列转换为向量?

时间:2011-08-15 20:08:36

标签: r dataframe vector type-conversion

我有一个数据框,例如:

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或其他语言相关的内容会有所帮助!)

11 个答案:

答案 0 :(得分:175)

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

数据框是一个列表。使用列名[对数据框进行子集时,您获得的是子列表(或子数据帧)。如果你想要实际的原子列,你可以使用[[,或者有些令人困惑(对我而言)你可以aframe[,2]返回一个向量,而不是子列表。

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

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

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

avector <- aframe[,2]
class(avector)

答案 1 :(得分:29)

您可以使用$提取:

class(aframe$a1)
[1] "numeric"

或双方括号:

class(aframe[["a1"]])
[1] "numeric"

答案 2 :(得分:19)

您不需要as.vector(),但确实需要正确编制索引:avector <- aframe[ , "a2"]

要注意的另一件事是drop=FALSE的{​​{1}}选项:

[

答案 3 :(得分:17)

现在可以使用libtensorflow_framework.so轻松完成此操作。

dplyr

答案 4 :(得分:8)

使用&#39; [[&#39;运算符是它与data.frame和data.table一起使用。因此,如果必须为data.frame和data.table运行该函数,并且您想要从中提取一个列作为向量,那么

data[["column_name"]] 

是最好的。

答案 5 :(得分:5)

您可以尝试这样的事情-

as.vector(unlist(aframe$a2))

答案 6 :(得分:4)

如果您只是使用提取操作符,它将起作用。默认情况下,[]设置选项drop=TRUE,这是您想要的。有关详细信息,请参阅?'['

>  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)
> aframe[,'a2']
[1]  6  7  8  9 10
> class(aframe[,'a2'])
[1] "numeric"

答案 7 :(得分:2)

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"

答案 8 :(得分:1)

我使用列表来筛选数据框,以使其是否具有列表中%in%的值。

我一直通过将1列数据框导出到Excel来手动创建列表,在粘贴到R之前,我会在每个元素周围添加“”:list <-c(“ el1”,“ el2”,...)通常紧随其后的是FilteredData <-子集(数据,列%in%列表)。

搜索stackoverflow之后,没有找到将1列数据帧转换为列表的直观方法,现在我发布我的第一个stackoverflow贡献:

# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
  list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")

答案 9 :(得分:1)

as.vector(unlist(aframe['a2']))

答案 10 :(得分:1)

我们还可以将data.frame列一般转换为一个简单的向量。 as.vector不够,因为它保留了data.frame类和结构,因此我们还必须提取第一个(也是唯一一个)元素:

df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]

到目前为止,所有建议的解决方案都需要对列标题进行硬编码。这使它们成为非泛型的(可以将其应用于函数参数)。

或者,您当然可以先从列中读取列名,然后将其插入其他解决方案的代码中。