【发布时间】:2013-07-22 13:27:53
【问题描述】:
我是 data.table 的新手,但我设法将 60 万行数据集中的计算从数千秒(使用 *ply 循环)减少到 1.7 秒。基本上,我需要同一 group 和 start 的组中 class 列中值最低的行。我正在使用
DT[, list(class=min(class)), by=list(group, start)]
但要做到这一点,我只使用来自具有更多列的 data.frame 中的这 3 列创建了 DT。因此,为了将我的结果与原始 data.frame 合并,我正在考虑使用 row.name,因此我使用 row.name=TRUE 创建了 DT,这是我所拥有的一个示例:
group start class rn
1: A 4943 4 1
2: A 5030 0 2
3: A 5030 4 3
4: A 5030 2 4
5: A 5083 4 5
6: A 5083 3 6
7: B 5041 0 7
8: B 5041 1 8
9: B 5083 4 9
...
我想要的结果只是 rn 对应于最小 class 值:
group start class rn
1: A 4943 4 1
2: A 5030 0 2
3: A 5083 3 6
4: B 5041 0 7
5: B 5083 4 9
...
但如果我使用:
DT[, list(class=min(class)), by=list(group, start, rn)]
或
DT[, list(class=min(class), rn), by=list(group, start)]
我得到了所有的行,而不仅仅是 class 最小值的行。
补充问题
我可以使用我的命令使用 data.table sintax 获得组中每个类类型的案例计数吗?
group start class rn class0 class1 class2 class3 class4
1: A 4943 4 1 0 0 0 0 1
2: A 5030 0 2 1 0 1 0 1
3: A 5083 3 6 0 0 0 1 1
4: B 5041 0 7 1 1 0 0 0
5: B 5083 4 9 0 0 0 0 1
...
【问题讨论】:
-
我不太明白“额外的问题”。您能否详细解释一下这些 1 和 0 的值是如何填充到这些列中的,以及为什么是 class0 - class4?
-
嗨,我想这有点令人困惑,因为类号对应于原始 data.frame 中的因素,我将它们转换为仅获得最小值(或您方法中的第一个)。我尝试做的额外工作是计算每个班级的每个班级有多少人。例如对于 group=="A" 和 start==5030 有 1'zero'、1'two' 和 1'four'
-
好的,知道了。让我试试看能不能找到办法。
-
我认为
dt[, list(class=class[1], rn=rn[1], class0=length(class[class==0])), by=list(group, start)]解决了!谢谢! -
是的,您可以手动为每个课程执行此操作(或者)您可以查看编辑 2 直接执行此操作。
标签: r data.table