2016-12-09 117 views
3

これは、昨夜私がデータをどのように書式化したいか再考した質問にピギーバックしています。私は検索しましたが、該当する回答を見つけることができませんでした。私は間違った言葉で検索しているかもしれません。Rを複数の行を1行にまとめます - 同じ列

私が結合したい多くの行で、データテーブルを持っている:

record_numb <- c(1,1,1,2,2,2) 
col_a <- c(123,'','',987,'','') 
col_b <- c('','234','','','765','') 
col_c <- c('','','543','','','543') 
df <- data.frame(record_numb,col_a,col_b,col_c) 
library(data.table) 
setDT(df) 

record_numb col_a col_b  col_c 
1    123 
1      234 
1         345 
2    987 
2      765 
2        543 

各行は常にcol_a、col_b、またはcol_c人口のいずれかを持っています。人口3人のうち1人以上が住んでいることはありません。私は、ピボットしたいこれらのレコードごとに単一の行に、それはこのように表示されるように(?):私は/メルトと遊んビットをキャストが、私はRの半分で、このような初心者だ

record_numb  col_a col_b col_c 
1    123  234  345 
2    987  765  543 

私の問題は、何が使えるかを知ることです。私はあなたの頭の上からパッケージや機能を指すことができればと思っています。私の検索では、私は融解してキャストするように指示しましたが、このケースには適用できませんでした。私は、任意の関数またはパッケージを使用することにオープンしています。

+0

私はこれをうまく利用することができます。データテーブルとして使用すると理想的ですが、時には変化することがあります。私は2:4のハードコーディングではなく、列の動的カウントのためにコードを修正しようとしています(これは多くのデータセットに対して行う必要があり、時間の経過とともに列の数は変化します)。ご回答有難うございます。 – fleetmack

答えて

4

あなたがあなたのコメントにdata.tableソリューションを希望することを示唆したように、あなたは、引数によってのものを除いて、「私のdata.table内のすべての変数を取る」、基本的に言う

library(data.table) 
df <- data.table(record_numb,col_a,col_b,col_c) 

df[, lapply(.SD, paste0, collapse=""), by=record_numb] 
    record_numb col_a col_b col_c 
1:   1 123 234 543 
2:   2 987 765 543 

.SDを使用することができます。 @ Frankの答えでは、彼は.SDcolsを使って変数のセットを減らします。変数を数値にキャストしたい場合でも、これを1行で行うことができます。ここに連鎖法があります。

df[, lapply(.SD, paste0, collapse=""), by=record_numb][, lapply(.SD, as.integer)] 

第2の「チェーン」はすべての変数を整数としてキャストします。

+0

完璧です。 .SDは何をしていますか?コードは機能しますが、それは私が理解していない部分です。 – fleetmack

+0

.SD + .SDcolsの詳細は、ユーザが書いた "Docs"ページにあります:http://stackoverflow.com/documentation/data.table/3787/use-sd-and-sdcols-for-the-subset-of-dataまた、もちろん '?.SD'があります。 – Frank

+0

ああ、ありがとう。私は?lapply(私は恋人が何をするか知っている、ハ!)そこにいるかもしれないと思って、私は思っていませんでしたか?ありがとう – fleetmack

3

あなたは、長い形式に再構築空白のエントリを削除し、その後、ワイドに戻ることができます。

res <- dcast(melt(df, id.vars = "record_numb")[ value != "" ], record_numb ~ variable) 

    record_numb col_a col_b col_c 
1:   1 123 234 543 
2:   2 987 765 543 

あなたが最初magrittrを使用してでそれがより読みやすいかもしれません:

library(magrittr) 
res = df %>% 
    melt(id.vars = "record_numb") %>% 
    .[ value != "" ] %>% 
    dcast(record_numb ~ variable) 

数でありますそれでも文字列として書式設定されていますが、それらを変換することはできます...

cols = setdiff(names(res), "record_numb") 
res[, (cols) := lapply(.SD, type.convert), .SDcols = cols] 

各列をどのようなクラスにするか(数値、整数、何でも)にしてください。 ?type.convertを参照してください。

関連する問題