2016-07-01 9 views
1

だが、一例として、虹彩データを取得し、わずかに変更してみましょう:R:長いワイド変換に削減使用して設定サフィックス

(注:代わりに、以下の2行は、「UPDATE#1」セクションから4行を使用する)

data(iris) 
iris$id <- rep(1:50, times = 3) 

データをこのquazi-long形式からワイド形式に変換する必要があります。その結果、各行のidは同じになります。言い換えれば、オリジナルの虹彩データは、3つのテーブル(各種に1つずつ)が1つずつ貼り付けられているとみなすことができます。私はこれらの3つのテーブルをもう一方の側面に貼り付ける必要があります。簡単だったと私はそれをこのようにやった

require(purrr) 
require(dplyr) 
iris %>% split(.$Species) %>% reduce(full_join, by = "id") 

は、上記の例では、 "Petal.Length.x"、...、 "Petal.Length.y" のような名前を生成します... 、 "Petal.Length"。私はそれらが好きです: "Petal.Length.setosa"、...、 "Petal.Length.versicolor"、...、 "Petal.Length.virginica"。したがって残っているのは、元の変数名に種名を追加することだけです。

の前にmapsetNamesを使ってみましたが、成功しませんでした。

私の1.5GBデータセットが純粋なロングフォーマット(私は多くのid-likeカラムが必要です)で13GBになるので、tidyrのgatherseparateは使いたくありません。

namesgsubといくつかの基本正規表現を使用して次の行に名前を追加する可能性がありますが、%>%フローを破ることなく実行できるかどうかわかりません。


UPDATE#1

、返信用のLMOをいただきありがとうございます!非常に素晴らしく清潔なソリューション!私が最初に見たとき、私は問題を過度に考えたように見えました...しかし、実際には私はそれをstackoverflowで単純化しました。のは、いくつかの混乱を追加してみましょう:

iris$id <- rep(sample(1:50, 50), times = 3) ## random order 
iris$drop_me <- sample(c(1,0), 150, TRUE, c(0.8, 0.2)) ## rows wirh 0 in this column will be missing 
iris <- iris[iris$drop_me == 1, ] 
iris$drop_me <- NULL 

は、だから私は、上記のデータを持っているし、今私は、私はいくつかの結果をスキップして実現ので、私もleft_joinからfull_joinに更新... reduceを使用してみてください。

ありがとうございました。ここ

答えて

2

splitdo.callを用いて基地R法である:

# get list of data frame, drop the split factor (Species) 
myList <- split(iris[, -which(names(iris) == "Species")], iris$Species) 
# perform wide transformation 
do.call(data.frame, myList) 

これは前方に種名を置きます。 gsubを使ってそれらを背中に移動することはそれほど難しくありません。ここで

は、結果の一部である:

setosa.Sepal.Length setosa.Sepal.Width setosa.Petal.Length setosa.Petal.Width 
1     5.1    3.5     1.4    0.2 
2     4.9    3.0     1.4    0.2 
3     4.7    3.2     1.3    0.2 
4     4.6    3.1     1.5    0.2 
5     5.0    3.6     1.4    0.2 
6     5.4    3.9     1.7    0.4 

他の種は、追加の列です。

# get list of data frame, drop the split factor (Species) 
myList <- split(iris[, -which(names(iris) == "Species")], iris$Species) 
# add names to data.frames 
myList <- lapply(names(myList), 
       function(i) { 
         setNames(myList[[i]], 
         c(paste0(head(names(myList[[i]]), -1), ".", i), "id")) 
       }) 

# merge the data.frames together 
Reduce(function(x, y) {merge(x, y, by="id", all=TRUE)}, myList) 

これは、あなたがに追加種と望んでいた命名につながる:更新#1

最初の行は同じであるが、これは、もう少し複雑になるため

答え各変数の終わり。

+0

あなたより、lmo!非常に素晴らしく清潔な解決策です。私は、しかし、私はスタックオーバーフローで自分の問題を単純化したことに気づいた。それを正しく反映するように質問を更新しました。よろしく、rpl。 – rpl

関連する問題