[英]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.