2017-05-09 75 views
1

_a我正在嘗試轉換數據集。我想實現的是,如果Intensitat = 1 - R創建一個新列 - 強度1a - 並寫入damage_a的值。如果Intensitat = 2 - R會創建另一個新列 - 強度2a - 並寫入damage_a的值。最後,如果Intensitat = 3,則R會執行新列 - 強度3a - 並寫入damage_a的值。 (它總是寫入對應於與強度指示符相同的行的damage_x的值)。從長數據表到寬數據表

然後我將運行相同的過程:從指示符變量創建3列 - 指標值的每列和每列中的值使用damage_b

最後一樣,但使用damage_c的值。

type <- sample(seq(from = 1, to = 5, by = 1), size = 50, replace = TRUE) 
type 

intensity <- sample(seq(from = 1, to = 3, by = 1), size = 50, replace = TRUE) 
intensity 

damage_a <- sample(seq(from = 1, to = 50, by = 1), size = 50, replace = TRUE) 
damage_b <- sample(seq(from = 1, to = 200, by = 1), size = 50, replace = TRUE) 
damage_c <- sample(seq(from = 1, to = 500, by = 1), size = 50, replace = TRUE) 

dat <- data.frame(type, intensity, damage_a, damage_b, damage_c) 

# want to evaluate if the difference in mean between different damages 
    dat1 <- subset(dat, select = c(type, intensity, damage_a)) 
    dat2 <- subset(dat, select = c(type, intensity, damage_b)) 
    dat3 <- subset(dat, select = c(type, intensity, damage_c)) 

對你來說這看起來像是一件非常容易的事,但我一直堅持了兩天。我已經嘗試過應用於tidyr函數,ifelse命令等,但從未獲得我所需要的東西。任何意見/想法都非常受歡迎。謝謝。

編輯

我設法改變格式,如果與這個小方便的功能表。

df.out <- unstack(dat, damage_a ~ intensity) 

現在的問題是,我得到長度不同的列表。我如何將這些列表組合到ona數據框中?

+0

也許'庫(data.table); dcast(setDT(DAT),型+ ROWID(類型,強度)〜 paste0(「intensity_」,intensity),value.var = c('damage_a','damage_b','damage_c'))' – akrun

+0

是的,但爲什麼在你的代碼中有一個'type_f'變量?你能稍微解釋一下這些命令的作用嗎? – Danka

+0

我發表了評論作爲一些解釋的解決方案 – akrun

回答

1

我們可以使用dcastdata.table可以採取多種value.var列。由於每組有多個觀測值,我們可以使用rowid函數通過公式中的'type'和'intensity'創建一個序列變量。這將導致一個新的列 'TYPE_1',但它可被分配給後來NULL

library(data.table) 
dcast(setDT(dat), type + rowid(type, intensity) ~ paste0("intensity_", 
    intensity), value.var = c('damage_a', 'damage_b', 'damage_c'))[, type_1 := NULL][] 
0

查看tidyr中的聚集和傳播函數,例如,

dat <- tidyr::spread(dat, damage, value, -intensity, -type) 
tidyr::spread(dat, damage, value)