对于组的子集,按组分组前500行

Ker*_*rry 4 r subset data.table

这必须是一个简单的答案.我想将我的数据子集用于测试目的.我有一个数据框,我想保留所有信息列,只需简单地减少每个人的观察数量.所以,我有一个独特的标识符和大约50个人.我想只选择2个AND,我想从这2个中仅选择500个数据点.

我的数据框被调用wloc08.有50个唯一ID.我只接受其中2个,但是那些2个,我只想要每个500个数据点.

subwloc08=subset(wloc08, subset = ID %in% c("F07001","F07005"))
Run Code Online (Sandbox Code Playgroud)

在这个声明的某处可以使用[吗?

 reduced= subwloc08$ID[1:500,]
Run Code Online (Sandbox Code Playgroud)

不行.

Ben*_*nes 6

如果你只处理2个人,那么你可以分别rbind对每个子集进行子集化,然后对每个子集进行子集化:

wloc08F07001 <- wloc08[which(wloc08$ID == "F07001")[1:500], ]

wloc08F07005 <- wloc08[which(wloc08$ID == "F07005")[1:500], ]

reduced <- rbind(wloc08F07001, wloc08F07005)
Run Code Online (Sandbox Code Playgroud)

为了使其更具通用性,特别是在处理大量数据时,您可以考虑查看data.table包.这是一个例子

library(data.table)

wloc08DT<-as.data.table(wloc08)  # Create data.table

setkey(wloc08DT, "ID")           # Set a key to subset on

# EDIT: A comment from Matthew Dowle pointed out that by = "ID" isn't necessary
# reduced <- wloc08DT[c("F07001", "F07005"), .SD[1:500], by = "ID"]
reduced <- wloc08DT[c("F07001", "F07005"), .SD[1:500]]
Run Code Online (Sandbox Code Playgroud)

要打破最后一步的语法:

  1. c("F07001", "F07005"):这将通过查找键等于F07001或的所有行来对数据进行子集化F07005.它还将鼓励"不经"(详见?data.table详情)

  2. .SD[1:500]:这将.SD通过选择行1:500来对对象(子集化data.table)进行子集化.

  3. 编辑由于Matthew Dowle的更正,此部分已删除."by by by"由步骤1启动.以前:( by = "ID":告诉[.data.table我们单独为每个ID执行步骤2中的操作,在这种情况下只显示您在步骤1中指示的ID.)

  • @BenBarnes你好.所有正确的wrt`SD`等,除了`by ="ID"`之外不需要.无论如何,`j`中的每个组都运行`j`.这对于提高效率非常重要.它被称为_by-without-by_,或_grouping-by-i_.通过包含`by ="ID"`它使它像复合查询一样工作:`wloc08DT [c("F07001","F07005")] [,.SD [1:500],by ="ID"]`,在这种情况下效率较低,其中`i`无论如何都加入了`ID`. (2认同)