R中数据框的列名

3

这可能听起来很琐碎,但我遇到了一个问题,即在查找数据框(只有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]"
> 

我正在从数据框“a”中选择1列,当我查询a1的列名时,希望输出为“x”。感谢您的帮助。谢谢


1
当你对'a'进行子集操作时,请使用drop参数:a1 <- a[,1,drop=FALSE] - user20650
谢谢。 :) 这正是我想要的。 - user1946217
@user20650 你应该将这个写成一个答案。 - jlhoward
2个回答

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。由于只有一列,a[,1]被强制转换为数字向量,并且列名丢失了。当您随后将向量传递给data.frame时,如果向量被命名,则列将使用其名称作为列名。因此,
names(data.frame(a1))
# [1] "a1"

所以在子集化时使用 drop = FALSE 来避免降维 - a1 将成为一个单列数据框。

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

0

不确定这是否提供了更多启示,但它仍然很有趣。看起来这可能是 drop = FALSE 的由来。

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

但实际上你可以这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接