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

のコードを見ると、コードの[.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 に答える
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 に答える
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 に答える