【问题标题】:in R, reshaping a "mixed" data frame using melt and cast在 R 中,使用熔化和铸造重塑“混合”数据框
【发布时间】:2017-06-24 00:44:14
【问题描述】:

我想绘制两种类型的值(dupl 和 orig)。是否可以轻松重塑以下数据框

record=c("r1","r1","r2","r3","r3")
v1=rep(0,5)
v2=c(0,0,1,0,0)
v3=c(1,1,0,1,1)
type=c("orig","dupl","orig","orig","dupl")

df<-data.frame(record, v1, v2, v3, type)
df
  record v1 v2 v3 type
1     r1  0  0  1 orig
2     r1  0  0  1 dupl
3     r2  0  1  0 orig
4     r3  0  0  1 orig
5     r3  0  0  1 dupl

看起来像这样?

record  v1.orig v2.orig v3.orig v1.dupl v2.dupl v3.dupl
r1         0       0       1       0       0       1
r2         0       1       0            
r3         0       0       0       0       0       0

重点是我可以绘制 vX.orig 与 vX.dupl 的图。还是有更好的方法来做到这一点? 我正在查看 dcast() 但似乎无法得到我想要的,可能是因为我的数据只是部分熔化(沿着类型?)。

编辑:这是我尝试过的:

df1<-melt(df,id="record")
dcast(df1,record~value, margins=TRUE)

【问题讨论】:

    标签: r casting scatter-plot melt


    【解决方案1】:

    在基础 R 中,这是一个简单的重塑:

    reshape(df, idvar="record", timevar="type", direction="wide")
    
    #  record v1.orig v2.orig v3.orig v1.dupl v2.dupl v3.dupl
    #1     r1       0       0       1       0       0       1
    #3     r2       0       1       0      NA      NA      NA
    #4     r3       0       0       1       0       0       1
    

    【讨论】:

      【解决方案2】:

      这是另一个使用来自reshape2recast 的选项

      library(reshape2)
      recast(df, record~variable + type)
      #   record v1_dupl v1_orig v2_dupl v2_orig v3_dupl v3_orig
      #1     r1       0       0       0       0       1       1
      #2     r2      NA       0      NA       1      NA       0
      #3     r3       0       0       0       0       1       1
      

      【讨论】:

        【解决方案3】:

        你可以这样做:

        library(reshape2)
        melted <- melt(df, id.vars= c("record", "type"))
        dcast(melted,  record ~ variable + type)
        
          record v1_dupl v1_orig v2_dupl v2_orig v3_dupl v3_orig
        1     r1       0       0       0       0       1       1
        2     r2      NA       0      NA       1      NA       0
        3     r3       0       0       0       0       1       1
        

        或者我原来的答案:

        library(tidyverse)
        df %>% gather(vx, num, -record, -type) %>%
            unite(type, vx, type) %>%
            spread(type, num)
        

        【讨论】:

        • 这可以推广到不以“v”开头的列吗? ...在我的真实场景中,我希望我的所有列 (40) 都复制为“_dupl”。
        • 确保您可以将该部分调整为其他 dplyr::select() 术语,使用 reshape2 查看编辑以获取替代项
        猜你喜欢
        • 2016-12-18
        • 2019-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多