2017-07-04 11 views
3

私はRが初めてで、少し苦労しています。私はこのデータフレームの一部を個々の列に置き換えます。

reg  12345 
val1 1 
val2 0 
reg  45678 
val1 0 
val2 0 
val3 1 
reg  97654 
val1 1 
reg  567834 
val3 1 
reg  567845 
val2 0 
val4 1 

のようなデータフレームを持っている私の目標は、誰かが私をここに導くことができることを望ん

reg  val1 val2 val3 val4 
12345 1  0  0  0 
45678 0  0  1  0 
97654 1  0  0  0 
567834 0  0  1  0 
567845 0  0  0  1 

には、この形式にデータを変換することです。私のデータソースは200行未満で、アプローチに関しては制約はありません。 マシンの実行中に十分なメモリと処理能力があるとします。

+0

を使用してオプションです。 。 tidyrとデータテーブルを使用する複数のアプローチがここにありますhttps://stackoverflow.com/questions/30592094/r-spreading-multiple-columns-with-tidyr – Niko

+0

[複数変数の反復測定をどのように広げることができますか(https://stackoverflow.com/questions/29775461/how-can-i-spread-repeated-measures-of-multiple-variables-into-wide-format) – Niko

+0

多分[this](https: //stackoverflow.com/a/44796994/2204410)はインスピレーションを与えることができます。 – Jaap

答えて

0

これが重複している場合でも、私は以下の回答を参照してください、そう...元のデータで起動しませんでした:

df <- data.frame(A = c("reg","val1","val2","reg","val1","val2","val3","reg","val1","reg","val3","reg","val2","val4"), 
        B = c(12345, 1, 0, 45678, 0, 0, 1, 97654, 1, 567834, 1, 567845, 0, 1)) 

私はラベルを追加するtidyverse動詞、およびトリックを使う(中dummycumsumを使用して、各"reg"グループに:

 reg val1 val2 val3 val4 
1 12345  1  0 NA NA 
2 45678  0  0  1 NA 
3 97654  1 NA NA NA 
4 567834 NA NA  1 NA 
5 567845 NA  0 NA  1 

install.packages("tidyverse") 
library(tidyverse) 
df1 <- df %>% 
      mutate(dummy = cumsum(A=="reg")) %>% 
      group_by(dummy) %>% 
      nest() %>% 
      mutate(data = map(data, ~spread(.x, A, B))) %>% 
      unnest() %>% 
      select(-dummy) 

これがもたらします

私はNAsを維持することを好むが、あなたがいない場合:ここでは

df1[is.na(df1)] <- 0 

    reg val1 val2 val3 val4 
1 12345  1  0  0  0 
2 45678  0  0  1  0 
3 97654  1  0  0  0 
4 567834  0  0  1  0 
5 567845  0  0  0  1 
+0

あなたのソリューションは私のために働いた。 – Acinonyx

0

あなたはワイドフォーマットに長い形式からデータフレームを変換する必要がdcast

library(data.table) 
dcast(setDT(df), cumsum(A=="reg") ~ A, value.var = "B", fill = 0)[, A := NULL][] 
#  reg val1 val2 val3 val4 
#1: 12345 1 0 0 0 
#2: 45678 0 0 1 0 
#3: 97654 1 0 0 0 
#4: 567834 0 0 1 0 
#5: 567845 0 0 0 1 
+1

あなたのソリューションはまた私のために働いた。 – Acinonyx

関連する問題