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

时间:2012-09-18 09:08:58

标签: r data.table subset

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

我的数据框称为wloc08。有50个唯一ID。我只接受其中2个人,但是那些人中只有2个,我只想要每个人有500个数据点。

subwloc08=subset(wloc08, subset = ID %in% c("F07001","F07005"))

在本声明的某处,我可以使用[吗?

 reduced= subwloc08$ID[1:500,]

不起作用。

2 个答案:

答案 0 :(得分:6)

如果你只与2个人打交道,你可以单独分组,然后rbind每个子集:

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

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

reduced <- rbind(wloc08F07001, wloc08F07005)

为了使其更具通用性,特别是在处理大量数据时,您可以考虑查看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]]

分解最后一步的语法:

  1. c("F07001", "F07005"):这会通过查找密钥等于F07001F07005的所有行来对数据进行分组。它还会煽动“不经”(详见?data.table

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

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

答案 1 :(得分:3)

您可以使用lapply

do.call("rbind",
        lapply(c("F07001", "F07005"),
               function(x) wloc08[which(wloc08$ID == x)[1:500], ]))

您的命令reduced = subwloc08$ID[1:500,]无效,因为subwloc08$ID是一个向量。但是,reduced = subwloc08$ID[1:500]会有效,但会返回subwloc08$ID的前500个值(而不是整个subwloc08行。)

如果要对前30个主题运行此命令,可以使用unique(wloc08$ID)[1:30]代替c("F07001", "F07005")

do.call("rbind",
        lapply(unique(wloc08$ID)[1:30],
               function(x) wloc08[which(wloc08$ID == x)[1:500], ]))