2011-08-15 53 views
93

我有一个数据帧,例如:R-友好的方式与R data.frame列转换为载体?

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" 

注:我vocabular y以上可能会关闭,所以请纠正我的情况。我还在学习R的世界。此外,这是怎么回事上的任何解释表示赞赏(即与Python或其他语言将帮助!)

+5

正如你在答案中看到的那样,仔细阅读'?'[。data.frame''会让你感觉很远。 – joran

+0

@joran:我认为这是我第一次遇到那个特定的帮助文件。谢谢!就在我计划迁移到data.table之前。 :) – Iterator

回答

137

我将试图解释这种未做任何错误,但我敢打赌,这将在评论中吸引澄清或两个。

的数据帧是一个列表。当你使用一列并[的名称子集的数据帧,什么你得到一个子列表(或子数据帧)。如果你想实际的原子塔,你可以使用[[,或有点混乱(我),你可以做aframe[,2]返回一个载体,而不是一个子表。

因此,尝试运行此程序,也许事情会更清楚:

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

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

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

+1这很有用。我已经习惯于使用'aframe [,“a2”]'因为能够在数据框架和矩阵中使用它,似乎得到了相同的结果 - 一个向量。 – Iterator

+6

'[...,drop = F]'将始终返回一个数据帧 – hadley

+1

这是特别好知道的,因为'df $ x''语法返回一个向量。我使用这种语法很长一段时间,但是当我不得不开始使用'df ['name']'或'df [n]'来检索列时,当我试图将它们发送到期望向量的函数时,我遇到了问题。使用'df [[n]]'或'df [['x']]'清除了一切。 – rensa

15

你不需要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'的提示很有用 - 这对于我可以从数据框中选择N列的情况有帮助,在N = 1的情况下。 – Iterator

+0

当我无法预见所选列的数量时,我会使用它,并且在出现一列的情况下,结果仍然会以n列的形式传递给data.frame。一个向量可能会将一只猴子扳手放入该行的功能中。 –

23

你可以使用$为Extrac重刑:

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

或双方括号:

class(aframe[["a1"]]) 
[1] "numeric" 
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" 
5

使用“[”运营商的另一个优点是,它的工作原理都与data.frame和data.table。因此,如果函数必须进行运行既data.frame和data.table,并且希望从中提取列作为载体,然后

data[["column_name"]] 

是最好的。

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

现在有一个简单的方法可以使用dplyr来做到这一点。

dplyr::pull(aframe, a2)