簡體   English   中英

重塑包:data.frame從寬到長

[英]reshape package: data.frame from wide to long

使用以下數據,

 library(reshape)
 P     <- c( "D" , "D" , "P" )
 a_0_2 <- c( "M" , "Y" , "M" )
 a_3_5 <- c( "M" , "M" , "Y" )
 n     <- c( 48  , 57  , 15  )
 df <- data.frame( P , a_0_2 , a_3_5 , n )

我想訪問以下data.frame:

 P variable value nIDs
 D    a_0_2     M   48
 D    a_0_2     Y   57
 P    a_0_2     M   15
 D    a_3_5     M   48
 D    a_3_5     M   57
 P    a_3_5     Y   15

我嘗試過melt( df , id.vars = "P" ) ,它當然不能正確處理n變量:

   P variable value
 1 D    a_0_2     M
 2 D    a_0_2     Y
 3 P    a_0_2     M
 4 D    a_3_5     M
 5 D    a_3_5     M
 6 P    a_3_5     Y
 7 D        n  <NA>
 8 D        n  <NA>
 9 P        n  <NA>
 Warning message:
 In `[<-.factor`(`*tmp*`, ri, value = c(48, 57, 15)) :
   invalid factor level, NA generated

但是,使用直觀的melt( df , id.vars = "P" , measure.vars = "n" )調用會產生

   P variable value
 1 D        n    48
 2 D        n    57
 3 P        n    15

這離目標還很遠。 我想念的是什么? 謝謝。

看來您只需要這個

melt(df, id.vars = c("P", "n"))
#   P  n variable value
# 1 D 48    a_0_2     M
# 2 D 57    a_0_2     Y
# 3 P 15    a_0_2     M
# 4 D 48    a_3_5     M
# 5 D 57    a_3_5     M
# 6 P 15    a_3_5     Y

或者使用更新的tidyr

library(tidyr)
gather(df, variable, value, a_0_2:a_3_5)
#   P  n variable value
# 1 D 48    a_0_2     M
# 2 D 57    a_0_2     Y
# 3 P 15    a_0_2     M
# 4 D 48    a_3_5     M
# 5 D 57    a_3_5     M
# 6 P 15    a_3_5     Y

如果我們假設df[2:3]不一定是因素(將stringsAsFactors = FALSE data.frame函數添加stringsAsFactors = FALSE ),則可以僅使用基數R添加@Thela提出的不錯的解決方案

data.frame(df[c(1, 4)], stack(df[2:3]))
#   P  n values   ind
# 1 D 48      M a_0_2
# 2 D 57      Y a_0_2
# 3 P 15      M a_0_2
# 4 D 48      M a_3_5
# 5 D 57      M a_3_5
# 6 P 15      Y a_3_5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM