我需要为具有重复名称的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
答案 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)
我希望有更好的东西:)