【问题标题】:reshape of a large data重塑大数据
【发布时间】:2013-07-21 18:13:59
【问题描述】:

我有一个包含 100 个变量和 400,000 个事务的大型数据集。这是一个示例数据:

a <- structure(list(ID = c("A1", "A2", "A3", "A1", "A1", "A2", "A4", "A5", "A2", "A3"), 
Type = c("A", "B", "C", "A", "A", "A", "B", "B", "C", "B"), 
Alc = c("E", "F", "G", "E", "E", "E", "F", "F", "F", "F"), 
Com = c("Y", "N", "Y", "N", "Y", "Y", "Y", "N", "N", "Y")),
.Names = c("ID", "Type", "Alc", "Com"), row.names = c(NA, -10L), class = "data.frame")
a

   ID Type Alc Com
1  A1    A   E   Y
2  A2    B   F   N
3  A3    C   G   Y
4  A1    A   E   N
5  A1    A   E   Y
6  A2    A   E   Y
7  A4    B   F   Y
8  A5    B   F   N
9  A2    C   F   N
10 A3    B   F   Y

我喜欢这样获取数据集:

ID      Type_A  Type_B  Type_C  Alc_E   Alc_F   Alc_G   Com_Y   Com_N
A1           3      0        0      3       0       0       2       1
A2           1      1        1      1       2       0       1       2
A3           0      1        1      0       1       1       2       0
A4           0      1        0      0       1       0       1       0
A5           0      1        0      0       1       0       0       1

我正在使用“reshape2”包中的“dcast”功能。但是结果不符合我的要求。

提前致谢。

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    由于您似乎只是针对a$ID 对每一列进行制表,因此您也可以在lapply 中使用table,如下所示:

    do.call(cbind, lapply(a[-1], function(x) table(a[[1]], x)))
    #    A B C E F G N Y
    # A1 3 0 0 3 0 0 1 2
    # A2 1 1 1 1 2 0 2 1
    # A3 0 1 1 0 1 1 0 2
    # A4 0 1 0 0 1 0 0 1
    # A5 0 1 0 0 1 0 1 0
    

    名称几乎没有那么漂亮,但很容易自定义您的 lapply 命令来解决这个问题:

    do.call(cbind, 
            lapply(names(a[-1]), function(x) {
              temp <- table(a[[1]], a[[x]])
              colnames(temp) <- paste(x, colnames(temp), sep = "_")
              temp
            }))
    #    Type_A Type_B Type_C Alc_E Alc_F Alc_G Com_N Com_Y
    # A1      3      0      0     3     0     0     1     2
    # A2      1      1      1     1     2     0     2     1
    # A3      0      1      1     0     1     1     0     2
    # A4      0      1      0     0     1     0     0     1
    # A5      0      1      0     0     1     0     1     0
    

    【讨论】:

      【解决方案2】:

      假设您的 data.frame 是 DF:

      require(reshape2)
      dcast(melt(DF, id.var=c("ID")), ID ~ variable + value, value.var="value")
      
      Aggregation function missing: defaulting to length
        ID Type_A Type_B Type_C Alc_E Alc_F Alc_G Com_N Com_Y
      1 A1      3      0      0     3     0     0     1     2
      2 A2      1      1      1     1     2     0     2     1
      3 A3      0      1      1     0     1     1     0     2
      4 A4      0      1      0     0     1     0     0     1
      5 A5      0      1      0     0     1     0     1     0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-08
        • 2019-11-17
        • 2023-04-06
        • 2020-12-11
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 2014-10-10
        相关资源
        最近更新 更多