7

次のようなデータフレームがあります。

df <- data.frame(0:2, 1:3, 2:4, 5:7, 6:8, 2:4, 0:2, 1:3, 2:4)
colnames(df) <- rep(c('a', 'b', 'c'), 3)
> df
  a b c a b c a b c
1 0 1 2 5 6 2 0 1 2
2 1 2 3 6 7 3 1 2 3
3 2 3 4 7 8 4 2 3 4

同じ名前の列が複数あります。同じ名前の列が独自のスーパー列に結合されるようにデータ フレームを再配置して、一意の列名のみが残るようにしたいと考えています。次に例を示します。

> df
  a b c
1 0 1 2
2 1 2 3
3 2 3 4
4 5 6 2
5 6 7 3
6 7 8 4
7 0 1 2
8 1 2 3
9 2 3 4

これを行う方法について何か考えはありますか?前もって感謝します!

4

5 に答える 5

9

これでうまくいくと思います。

説明

df[,names(df) == 'a']名前を持つすべての列を選択しますa

unlist上記の列を 1 つの単一ベクトルに変換します

unnameこれらのベクトルに与えられたいくつかの行名を削除します。

unique(names(df))で一意の列名が付けられますdf

sapplyのすべての値にインライン関数を適用しますunique(names(df))

> df
  a b c a b c a b c
1 0 1 2 5 6 2 0 1 2
2 1 2 3 6 7 3 1 2 3
3 2 3 4 7 8 4 2 3 4
> sapply(unique(names(df)), function(x) unname(unlist(df[,names(df)==x])))
      a b c
 [1,] 0 1 2
 [2,] 1 2 3
 [3,] 2 3 4
 [4,] 5 6 2
 [5,] 6 7 3
 [6,] 7 8 4
 [7,] 0 1 2
 [8,] 1 2 3
 [9,] 2 3 4
于 2013-04-04T05:25:17.393 に答える
2

data.frame列名でソートし、リストから外して、次のように使用as.data.frameしますmatrix

A <- unique(names(df))[order(unique(names(df)))]
B <- matrix(unlist(df[, order(names(df))], use.names=FALSE), ncol = length(A))
B <- setNames(as.data.frame(B), A)
B
#   a b c
# 1 0 1 2
# 2 1 2 3
# 3 2 3 4
# 4 5 6 2
# 5 6 7 3
# 6 7 8 4
# 7 0 1 2
# 8 1 2 3
# 9 2 3 4
于 2013-04-04T05:34:14.223 に答える
0

私は今、コンピューターの前にいないので、これをテストすることはできませんが.. これはうまくいくかもしれません:

do.call(cbind, 
     lapply(names(df) function(x) do.call(rbind, df[, names(df) == x])) )
于 2013-04-04T05:25:03.577 に答える