将data.frame列转换为向量?


163

我有一个数据框,例如:

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或其他某种语言有关将有所帮助!)


5
正如您在答案中看到的那样,仔细阅读?'[.data.frame'将会使您走得很远。
joran 2011年

Answers:


208

我将尽一切可能进行解释,但我认为这将在评论中引起一两个澄清。

数据框是一个列表。当您使用列名和子集数据框架时[,您得到的是一个子列表(或子数据框架)。如果您想要实际的原子列,则可以使用[[,或者(在我看来)有些混乱,您可以这样做aframe[,2],它返回一个向量,而不是一个子列表。

因此,尝试运行此序列,也许情况会更加清楚:

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

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

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

6
+1这很有用。我已经习惯了使用它,aframe[,"a2"]因为能够同时在数据帧和矩阵中使用它,而且似乎得到了相同的结果-向量。
Iterator

8
[..., drop = F]将始终返回数据帧
hadley

1
知道这一点特别好,因为df$x语法返回一个向量。我使用这种语法已经很长时间了,但是当我不得不开始使用df['name']df[n]检索列时,在尝试将其发送到期望向量的函数时遇到了问题。立即使用df[[n]]df[['x']]清除所有内容。
伦萨

8
为什么as.vector似乎默默地没有效果?这不是返回向量还是明显失败?
bli

aframe[['a2']]sf对象非常有用,因为aframe[,"a2"]因为包含了geometry列,所以将返回两列。
马特


32

您可以使用$提取:

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

或双方括号:

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

21

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

在另一件事情要注意的是drop=FALSE选项[

R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15)
R> aframe
  a1 a2 a3
1  1  6 11
2  2  7 12
3  3  8 13
4  4  9 14
5  5 10 15
R> avector <- aframe[, "a2"]
R> avector
[1]  6  7  8  9 10
R> avector <- aframe[, "a2", drop=FALSE]
R> avector
  a2
1  6
2  7
3  8
4  9
5 10
R> 

4
+1:提醒drop=FALSE很有用-如果我可以从data.frame中选择N列(在N = 1的情况下),这对我有帮助。
Iterator

当无法预见所选的列数并且如果出现一列时,我将使用此方法,结果仍将作为具有n列的data.frame传递。向量可以将活动扳手插入功能线中。
RomanLuštrik2011年

11

使用'[['运算符的另一个优点是,它可以同时使用data.frame和data.table。因此,如果必须使该函数同时运行data.frame和data.table,并且您想从中提取列作为矢量,则

data[["column_name"]] 

是最好的。



5

如果仅使用提取运算符,它将起作用。默认情况下,[]设置option 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"


3
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"

2

我使用列表通过数据框是否具有值%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")

1

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.