2017-10-17 3 views
0

を拡張コラム「による」...コンパクト/エレガントでの値に接合されましたそこで入力され変換は、名前が列名から形成された1つの拡張行にいくつかのタブのデータを変換しようと

library(data.table) 
# input 
bar <- data.table(c1 = c(1L, 2L), c2 = c(3L, 4L), c3 = c("aa", "bb")) 
# output 
baz <- data.table(c1_aa = 1L, c1_bb = 2L, c2_aa = 3L, c3_bb = 4L) 

> bar 
    c1 c2 c3 
1: 1 3 aa 
2: 2 4 bb 

、所望data.table使用するが、どのような(data.table好ましいが)であることができるMWE、を有する方法...

容易出力は:

> baz 
    c1_aa c1_bb c2_aa c3_bb 
1:  1  2  3  4 
+3

かなり確信して効率がこのような何かには関係することはできません。とにかく、そこの 'dcast(溶融(バー、ID = "C3")、。〜変数+ C3)'ユーザーの答えに類似。 – Frank

+1

@Frank同上!できるだけコンパクトであることを意味する効率性...これは実現します。どうもありがとう。あなたが答えることができればそれを受け入れるでしょう。 –

答えて

3

ここでは、@ユーザーの回答のdata.tableアナログだ

dcast(melt(bar, id="c3"), . ~ variable + c3) 

dcastデフォルト(セパレータとして_の列の順序と使用上の)ショートのおかげであることを起こります。あなたの最終的な出力は、列の数十万人を持っていない限り

+1

感謝として 'tidyverse'を扱うことができ@JohnSmith –

2

ないdata.tableが、dplyr + tidyrとの素晴らしい作品:

library(dplyr) 
library(tidyr) 

bar %>% 
    gather(variable, value, c1:c2) %>% 
    unite(variable, variable, c3, sep = "_") %>% 
    spread(variable, value) 

結果:

c1_aa c1_bb c2_aa c2_bb 
1  1  2  3  4 
+0

多くのありがとう。 sligthly好むフランクの答えは上記だけで、最小限のパッケージ方針のための素敵な答えとupvoted ... ...あなたは一つのパッケージ:) –

+0

は、それが一つの列を作成することに気づきました「」.. 。最後に '[、-1、with = F]'で簡単に修正できます。 – useR

関連する問題