使用data.table根据另一列中的类别计算出现的百分比

时间:2015-11-26 20:11:45

标签: r data.table

最近我在R中使用data.table,它非常受欢迎且效率很高。目前我遇到了一个我认为可以使用data.table解决的问题。

我有这样的数据集:

event | group_ind 
  1   | group1
  1   | group1
  1   | group1
  2   | group1
  2   | group1
  1   | group2
  1   | group2
  2   | group2
  2   | group3
  2   | group3

现在我想知道每个组中事件1的百分比。该数据集的结果是显而易见的:组1中事件1为60%,组2中为67%,组3中为0。实际上,数据集具有超过2种事件类型的更多观察值,并且行不按特定顺序排序。我可以在R中以非常虚拟的方式得到我想要的东西(通过计算事件列中的出现次数除以每组中的总观察值),但我认为应该有更好的方式来做到这一点。

所以我想要的结果是这样的:

 event | group_ind | percentage
   1   | group1    | 0.6
   2   | group1    | 0.4
   1   | group2    | 0.67
   2   | group2    | 0.33
   1   | group3    | 0
   2   | group3    | 100

我希望这可以在data.table中完成。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

一个简单的解决方案就是

    Connection conn = DriverManager.getConnection(...);
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("create table test (value NUMERIC(5,2));");
    String sql = "INSERT INTO test (value) VALUES(?)";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setBigDecimal(1, BigDecimal.ONE);
    pstmt.executeUpdate();
    ResultSet rs = stmt.executeQuery("SELECT * FROM test");
    while (rs.next()) {
        Assert.assertEquals(BigDecimal.ONE, rs.getBigDecimal(1));
    }
    rs.close();
    stmt.close();
    conn.close();

虽然更通用的解决方案是在setDT(DT)[, .(event = 1:2, percentage = tabulate(event)/.N), by = group_ind] # group_ind event percentage # 1: group1 1 0.6000000 # 2: group1 2 0.4000000 # 3: group2 1 0.6666667 # 4: group2 2 0.3333333 # 5: group3 1 0.0000000 # 6: group3 2 1.0000000 上使用unique(并按照@EdM的建议对其进行预订)。

event