2017-03-06 4 views
3

同じ名前の複数の列をそれぞれ新しい行に貼り付けようとしていますが、奇妙な動作が発生します。例:複数の列を貼り付ける(奇妙な振る舞い)

x <- data.frame(x = 1:10, y= 2:11, z= 11:20) 
colnames(x) <- c("x", "y", "x") 
x 
> x 
    x y x 
1 1 2 11 
2 2 3 12 
3 3 4 13 
4 4 5 14 
5 5 6 15 
6 6 7 16 
7 7 8 17 
8 8 9 18 
9 9 10 19 
10 10 11 20 
# now I try to paste columns to rows 

> x2 <- data.frame(columns = unique(colnames(x)), 
+     values = sapply(1:length(unique(colnames(x))), function(i) 
+     paste(x[,(which(unique(colnames(x))[i]==colnames(x)))], collapse = ", "))) 
> x2 
    columns       values 
1  x     1:10, 11:20 
2  y 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 

私が持っていると思った何がちょうど

> x2 
columns       values 
1  x 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 
2  y 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 

誰かがこの動作を防止し、私を助けてもらえますか?あなたが折りたたまれた値を持つデータフレーム必要がある場合で

+1

を、 'ユニーク(COLNAMES(X))を呼び出す必要はありません「何度も。代わりに変数に保存することができます。また、特定の書式にこのタスクが必要ない場合は、「文字」と「ペースト」を強制することを避けることをお勧めします。 - 集約(cbind(values = unlist(x、use.names = FALSE)〜 rep(名前(x)、each = nrow(x))、FUN = c) 'となります。最後に、 "integer"( "x"という列)の "list"を 'paste'に渡します。これは暗黙のうちに、この" list "で' as.character'を使用し、その結果は 'as 'のためです。文字は ''リストを扱う "引数 - ' as.character(list(1:5)) ' –

+0

本当に役に立つ説明でした!私の実際のデータは実際にテキストであるので私はペーストを使用しますが、それはまだ理にかなっています。 – JonGrub

答えて

0
x <- data.frame(x = 1:10, y= 2:11, z= 11:20) 
colnames(x) <- c("x", "y", "x") 
unique_cols <- unique(colnames(x)) 
x2 <- sapply(unique_cols, function(s) unlist(x[, unique_cols == s], use.names = F)) 
x2 

$x 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
$y 
[1] 2 3 4 5 6 7 8 9 10 11 

typeof(x2) 
[1] "list" 

:注意点としては

df <- data.frame(columns = unique_cols, 
       value = as.character(sapply(x2, function(s) paste(s, collapse = ","), USE.NAMES = F))) 

df 

    columns            value 
1  x 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 
2  y        2,3,4,5,6,7,8,9,10,11 
+0

チャームのように働いた:) – JonGrub