2017-07-04 63 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動詞,並一招添加標籤(以dummy)到每個"reg"組使用cumsum

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) 

這導致:

 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 

我寧願保持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

相關問題