4

我需要用重复的名称命名 data.frame 的列。里面的data.frame你可以check.names = FALSE用来做顽皮的名字契约。但是,如果您将其编入索引,那么您在编入索引时就会失去顽皮的名字。我想保留这些名字。所以 beloe 是一个例子,我得到的输出是我想得到的:

x <- data.frame(b= 4:6, a =6:8, a =6:8, check.names = FALSE)
x[, -1]

我得到:

  a a.1
1 6   6
2 7   7
3 8   8

我想要:

  a a
1 6 6
2 7 7
3 8 8
4

4 回答 4

5

这个怎么样:

subdf <- function(df, ii) {
    do.call("data.frame", c(as.list(df)[ii], check.names=FALSE))
}

subdf(x, -1)
#   a a
# 1 6 6
# 2 7 7
# 3 8 8

subdf(x, 2:3)
#   a a
# 1 6 6
# 2 7 7
# 3 8 8
于 2012-10-12T20:49:30.377 回答
3

这是一个丑陋的解决方案

> tmp <- data.frame(b=4:6, a=6:8, a=6:8, check.names=FALSE)
> setNames(tmp[, -1], names(tmp)[-1])
  a a
1 6 6
2 7 7
3 8 8
于 2012-10-12T20:48:32.370 回答
3

查看代码[.data.frame作为代码的一部分

if (anyDuplicated(cols)) 
    names(y) <- make.unique(cols)

而且我在代码中看不到任何允许跳过该检查的内容。所以看起来我们只需要编写自己的函数。虽然它不是很安全,但我相信可以创建一个更好的版本......

dropCols <- function(x, cols){
  nm <- colnames(x)
  x <- x[, -cols]
  colnames(x) <- nm[-cols]
  x
}

x <- data.frame(b= 4:6, a =6:8, a =6:8, check.names = FALSE)
#x[, -1]
dropCols(x, 1)
#  a a
#1 6 6
#2 7 7
#3 8 8
于 2012-10-12T20:49:29.673 回答
2

根据 dirks 的舌头评论:

safe.data.frame <- function(dat, index) {
    colnam <-colnames(dat)[index]
    dat2 <- dat[, index]
    colnames(dat2) <- colnam
    dat2
}
safe.data.frame(x, -1)

我希望有更好的东西:)

于 2012-10-12T20:49:43.807 回答