【问题标题】:How do I reshape this wide table in R to allow pairwise comparisons? [duplicate]如何在 R 中重塑这个宽表以允许成对比较? [复制]
【发布时间】:2017-03-24 12:54:38
【问题描述】:

我有以下数据:

structure(list(id = c(174L, 187L, 188L, 190L, 213L, 234L), p7 = c(1L, 
1L, NA, 1L, 0L, 1L), p4 = c(1L, NA, NA, 1L, 1L, 1L), p3 = c(1L, 
1L, 1L, 1L, NA, 1L), p6 = c(1L, NA, NA, 1L, 1L, 1L), p1 = c(1L, 
1L, 1L, 1L, NA, 1L), p2 = c(1L, 1L, 1L, 1L, 1L, 1L), p5 = c(1L, 
0L, NA, 1L, NA, 1L), p8 = c(1L, NA, NA, 1L, 1L, 1L), q1 = c(1L, 
1L, NA, NA, NA, NA), q2 = c(NA, NA, 0L, NA, NA, NA), q3 = c(1L, 
1L, 1L, NA, 0L, 0L), q4 = c(NA, NA, NA, 0L, 0L, 0L), q5 = c(NA, 
1L, 0L, 1L, 0L, 1L), q6 = c(1L, NA, 1L, 1L, 0L, NA), q7 = c(0L, 
NA, 0L, 0L, NA, 1L), q8 = c(1L, NA, 0L, 0L, 0L, 0L)), .Names = c("id", 
"p7", "p4", "p3", "p6", "p1", "p2", "p5", "p8", "q1", "q2", "q3", 
"q4", "q5", "q6", "q7", "q8"), row.names = c(NA, 6L), class = "data.frame")

我需要一个数据框,其中第一列包含重复 8 次的 id,第二列包含标记为 p 的所有值(按此顺序),第三列包含标记为的所有值q(按此顺序)。我需要这个,以便我可以在对应的 ps 和 qs 数据点之间进行成对比较。

有什么提示吗?

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:
    library(reshape2)
    
    df = structure(list(id=c(174L,187L,188L,190L,213L,234L),p7=c(1L,
    1L,NA,1L,0L,1L),p4=c(1L,NA,NA,1L,1L,1L),p3=c(1L,
    1L,1L,1L,NA,1L),p6=c(1L,NA,NA,1L,1L,1L),p1=c(1L,
    1L,1L,1L,NA,1L),p2=c(1L,1L,1L,1L,1L,1L),p5=c(1L,
    0L,NA,1L,NA,1L),p8=c(1L,NA,NA,1L,1L,1L),q1=c(1L,
    1L,NA,NA,NA,NA),q2=c(NA,NA,0L,NA,NA,NA),q3=c(1L,
    1L,1L,NA,0L,0L),q4=c(NA,NA,NA,0L,0L,0L),q5=c(NA,
    1L,0L,1L,0L,1L),q6=c(1L,NA,1L,1L,0L,NA),q7=c(0L,
    NA,0L,0L,NA,1L),q8=c(1L,NA,0L,0L,0L,0L)),.Names=c("id",
    "p7","p4","p3","p6","p1","p2","p5","p8","q1","q2","q3",
    "q4","q5","q6","q7","q8"),row.names=c(NA,6L),class="data.frame")
    
    p = melt(df, id.vars=c("id"),measure.vars=c("p7", "p4", "p3", "p6","p1", "p2", "p5", "p8"), variable.name="p")
    q = melt(df, id.vars=c("id"),measure.vars=c("q1", "q2", "q3", "q4","q5", "q6", "q7", "q8"), variable.name="q")
    both = cbind(p, q)
    

    【讨论】:

    • 这是一个数据框,因此您可以简单地查看使用:head(both)
    【解决方案2】:

    我们可以使用来自data.tablemelt 轻松做到这一点,它可以采用多个measure patterns

    library(data.table)
    melt(setDT(df), measure = patterns("^p\\d+", "^q\\d+"), 
                      value.name = c("p", "q"), variable.name = "grp")
    

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 2021-12-12
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多