使用索引保留不正确的名称

时间:2012-10-12 20:35:37

标签: r

我需要为具有重复名称的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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:2)

每个dirks舌头在脸颊评论:

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

我希望有更好的东西:)