【问题标题】:Transpose data by groups in R在 R 中按组转置数据
【发布时间】:2013-06-27 06:05:03
【问题描述】:

我有以下结构的数据:

x <- read.table(header=T, text="
X Y D S
a e 1 10
a e 2 20
a f 1 50
b c 1 40
b c 2 30
b c 3 60
b d 1 10 
b d 2 20")

我想得到以下结果:

X Y   1   2   3
a e  10  20
a f  50
b c  40  30  60
b d  10  20

对于XY 列的每种组合,我想按D 列中的顺序转置S 列中的数据。

我认为xtabs() 会起作用,但我不这么认为,我最好的版本是:

xtabs(formula=S~Y+D,data=x)

结果:

   D
Y    1  2  3
  c 40 30 60
  d 10 20  0
  e 10 20  0
  f 50  0  0

【问题讨论】:

    标签: r reshape data-manipulation


    【解决方案1】:

    其他两个答案非常好,但就其价值而言,既然您提到您从 xtabs 开始尝试,您可以接近您的正在寻找 xtabsftable 的组合。但是,结果将包括所有因子水平

    ftable(xtabs(S ~ ., x))
    #     D  1  2  3
    # X Y           
    # a c    0  0  0
    #   d    0  0  0
    #   e   10 20  0
    #   f   50  0  0
    # b c   40 30 60
    #   d   10 20  0
    #   e    0  0  0
    #   f    0  0  0
    

    或者,您可以执行以下操作:

    data.frame(unique(x[1:2]), 
               as.data.frame.matrix(xtabs(S ~ do.call(paste, x[1:2]) + D, x)))
    #   X Y X1 X2 X3
    # 1 a e 10 20  0
    # 3 a f 50  0  0
    # 4 b c 40 30 60
    # 7 b d 10 20  0
    

    【讨论】:

      【解决方案2】:

      基础 R 中的解决方案:

      > reshape(x, timevar="D", idvar=c("X","Y"), direction="wide")
        X Y S.1 S.2 S.3
      1 a e  10  20  NA
      3 a f  50  NA  NA
      4 b c  40  30  60
      7 b d  10  20  NA
      

      【讨论】:

        【解决方案3】:
        require(reshape2)
        dcast(x, X + Y ~ D, value.var="S")
        

        如果您想用0 而不是NA(这是默认值)填充空条目,那么,

        dcast(x, X + Y ~ D, value.var="S", fill=0)
        

        【讨论】:

          猜你喜欢
          • 2022-01-10
          • 2020-03-08
          • 2018-12-15
          • 2015-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-02
          • 2021-12-28
          相关资源
          最近更新 更多