【问题标题】:Using reshape package to combine columns使用 reshape 包合并列
【发布时间】:2012-06-06 13:54:10
【问题描述】:

我在数据框中有以下格式的数据:

id a b c d e f x y z
1  0 0 0 1 1 0 1 0 1 
2  1 0 0 1 0 0 1 0 0 

我想做的是找出 a 和 x 在同一个地方有多少次 1,a 和 y 在同一行中有多少次 1,依此类推。本质上,(a,b,c,d,e,f) 和 (x,y,z) 应该被分组为两个变量。

我一直在尝试使用 reshape 包(使用 melt 和 cast )来做到这一点,我能想到的最好的方法是如下所示:

id a b c d e f x y z
1  1 0 0 0 1 0 10 5 3 
2  0 1 0 1 0 0 25 0 48

我想看到的是这样的:

  x    y    z
a 10   5    3
b 25   0    48

非常感谢您在这方面的帮助。我是 reshape 包的新手。

问候,

阿伦

【问题讨论】:

    标签: r casting reshape melt


    【解决方案1】:

    如果您的数据在数据框data 中,您可以这样做:

    mdata <- melt(data, measure.vars=c("a","b","c","d","e","f"))
    mmdata <- melt(mdata, measure.vars=c("x","y","z"))
    colnames(mmdata) <- c("var1","val1","var2","val2")
    mmdata <- mmdata[mmdata$val1 & mmdata$val2,]
    cast(mmdata, var1~var2)
    

    【讨论】:

    • 对于 reshape2,cast 变为 dcast
    【解决方案2】:

    这可能是一个解决方案,但可能会有更简单或更简洁的方法。它使用了双 sapply,我认为我有一天不会使用它 :-) :

    这是您的数据:

    d <- data.frame(a=c(1,0,1),
                    b=c(1,0,0),
                    c=c(0,1,1),
                    x=c(1,1,1),
                    y=c(1,0,0),
                    z=c(1,0,1))
    

    首先我们在两组变量之间拆分数据:

    d1 <- d[,c("a","b","c")]
    d2 <- d[,c("x","y","z")]
    

    这里是代码:

    tmptab <- function(v1,v2) {
      tab <- as.data.frame(table(v1,v2))
      result <- tab$Freq[tab$v1==1 & tab$v2==1]
      if (is.na(result)) result <- 0
      return(result)
    }
    
    sapply(d2, function(v) {
      sapply(d1, tmptab, v)
    })
    

    这给出了:

      x y z
    a 2 1 2
    b 1 1 1
    c 2 0 1
    

    【讨论】:

      【解决方案3】:

      挖骷髅……

      这是一种可能的方法。不知道它是否比其他的有任何改进......

      ## Save ourselves some typing...
      Group1 <- c("a", "b", "c", "d", "e")
      Group2 <- c("x", "y", "z")
      
      ## melt the data
      A <- melt(mydf, id.vars="id")
      
      ## Split and merge
      B <- Reduce(function(x, y) merge(x, y, by = "id"), 
                  split(A, A$variable %in% Group1))
      
      ## Subset
      B.sub <- B[B$value.x == 1 & B$value.y == 1, c("variable.y", "variable.x")]
      
      ## Factor (so table works nicely)
      ## Without `factor`, rows or columns which are all zeroes
      ##   will be dropped during the tabulation, which may be fine
      B.sub$variable.y <- factor(B.sub$variable.y, Group1)
      B.sub$variable.x <- factor(B.sub$variable.x, Group2)
      
      ## Tabulate
      table(B.sub)
      #           variable.x
      # variable.y x y z
      #          a 1 0 0
      #          b 0 0 0
      #          c 0 0 0
      #          d 2 0 1
      #          e 1 0 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 2014-03-01
        • 2020-07-29
        • 1970-01-01
        • 2013-12-07
        相关资源
        最近更新 更多