最近我在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中完成。非常感谢您的帮助。
答案 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