r中数据帧的colnames

时间:2014-04-18 15:05:26

标签: r dataframe names

这可能听起来微不足道,但我在查找数据框的列名(1列)方面遇到了问题

> a <- data.frame(x = c(1,2,3,4,5), y = c("a", "a","c","d","r"))
> a
  x y
1 1 a
2 2 a
3 3 c
4 4 d
5 5 r
> colnames(a)
[1] "x" "y"
> names(a)
[1] "x" "y"
> a1 <- a[,1]
> class(a1)
[1] "numeric"
> a1
[1] 1 2 3 4 5
> a1 <- as.data.frame(a[,1])
> a1
  a[, 1]
1      1
2      2
3      3
4      4
5      5
> colnames(a1)
[1] "a[, 1]"
> names(a1)
[1] "a[, 1]"
> 

我从数据框中选择1列&#34; a&#34;,我希望输出为&#34; x&#34;当我查询a1的列名时。感谢您的帮助。感谢

2 个答案:

答案 0 :(得分:1)

# Data
a <- data.frame(x = c(1,2,3,4,5), y = c("a", "a","c","d","r"), z = 1:5)

class(a)
#[1] "data.frame"

# Subset a
a1 <- a[,1]

class(a1)
is.vector(a1)
is.data.frame(a1)

这是一个名为a1(不是x)的数字向量。查看drop中的?"["参数:默认值为drop =TRUE。因为只有一列,所以[,1]被强制转换为数字向量,并且列名丢失。当您随后将向量传递给data.frame时,列将采用传递给它的向量的名称(如果它被命名),因此

names(data.frame(a1))
# [1] "a1"

因此在子集化时使用drop = FALSE以避免减少 - a1将是一列data.frame

(a1 <- a[,1, drop = FALSE])
#  x
#1 1
#2 2
#...

答案 1 :(得分:0)

不确定这是否会提供任何进一步的启示,但它仍然很有趣。似乎这可能是drop = FALSE的结果。

> a1 <- structure(data.frame(a[,1]), .Names = names(a)[1])
> colnames(a1)
# [1] "x"

但你真的可以这样做:

> a1 <- a["x"]
> colnames(a1)
# [1] "x"