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
# a1 a2 a3
# 1 1 6 11
# 2 2 7 12
# 3 3 8 13
# 4 4 9 14
# 5 5 10 15
avector0 <- as.vector(aframe['a2'])
class(avector)
# [1] "data.frame"
问题是这样的,提问者想取出afrme中的第二列,但是尽管使用了as.vector得到的仍然是一个数据框。
于是有人回答:
A data frame is a list. When you subset a data frame using the name of a column and [, what you're getting is a sublist (or a sub data frame). If you want the actual atomic column, you could use [[, or somewhat confusingly (to me) you could do aframe[,2] which returns a vector, not a sublist.
avector1<- aframe[['a2']]
class(avector1)
# [1] "numeric"
avector2<- aframe[,2]
class(avector2)
# [1] "numeric"
avector3 <- aframe[,"a2"]
class(avector3)
# [1] "numeric"
avector4 <- aframe$a2
class(avector4)
# [1] "numeric"
以上四种方式都是OK的,可是提问者还恰好用了不对的方式~ 哈哈哈
其实主要的问题在于操作符 [ 和 [[
我们可以使用
?'['
?'[['
?'[.data.frame'
另外注意,[中有一个drop(降维)参数
如果drop为T,则将数据框降维list....(蛋疼)
> avector <- as.vector(aframe['a2',,drop=TRUE])
> class(avector)
[1] "list
> avector <- as.vector(aframe['a2',drop=TRUE])
Warning message:
In `[.data.frame`(aframe, "a2", drop = TRUE) : 忽略'drop'参数
> class(avector)
[1] "data.frame"
> avector <- as.vector(aframe[,'a2',drop=F])
> avector
a2
1 6
2 7
3 8
4 9
5 10
> class(avector)
[1] "data.frame"
来自sf的这篇问答
http://stackoverflow.com/questions/7070173/r-friendly-way-to-convert-r-data-frame-column-to-a-vector