2017-11-25 89 views
2

我有包含兩組數據觀測一個數據幀(A,B),與由列名稱給定的數據集和觀測類型:R:從廣角重塑數據幀基於化合物列名長格式

mydf <- data.frame(meta1=paste0("a",1:2), meta2=paste0("b",1:2), 
        A_var1 = c(11:12), A_var2 = c("p","r"), 
        B_var1 = c(21:22), B_var2 = c("x","z")) 

我想重新設計此數據框,以便每行僅包含一組觀察值。在這漫長的格式,設置和列名應通過在「_」分裂原始列名給出:

mydf2 <- data.frame(meta1=rep(paste0("a",1:2),2), 
        meta2=rep(paste0("b",1:2),2), 
        set=c("A","B","A","B"), 
        var1 = c(11:12), 
        var2 = c("a","b","c","d")) 

我一直在使用與「str_split」,「子」組合「收集」嘗試,但很遺憾沒有成功。這可以通過使用潮流函數來完成嗎?

回答

1

是的,你可以用tidyverse做到這一點!

您已經關閉,您需要gather,然後separate,然後spread

new_df <- mydf %>% 
    gather(set, vars, 3:6) %>% 
    separate(set, into = c('set', 'var'), sep = "_") %>% 
    spread(var, vars) 

希望這有助於!

+0

謝謝!奇蹟般有效。但是,它確實會生成兩條警告消息: 1:各個度量變量的屬性不相同;他們將被丟棄 2:使用...將參數傳遞給'strsplit()'已失效。任何方式來避免這些被生成? –

+0

很高興幫助。所以我得到了同樣的錯誤。第一個是因爲你的A_var1,A_var2等列都是因子和數字。它強制它們變成字符,因爲它不能混合它們。您可以通過首先將這些列更改爲「字符」來避免這種情況。但沒關係。我意識到的第二個錯誤是因爲我使用'by =',而不是'sep =',在'separate'中。我剛剛編輯過,即使他們都工作。 'sep ='是正確的。 如果您接受答案,請勾選複選框,如果您願意的話!謝謝。 –

+0

謝謝。將第二個短語更改爲'gather(set,vars,contains(「_」))'使得解決方案更加通用。 –