4

这必须是一个简单的答案。我想对我的数据进行子集化以进行测试。我有一个数据框,我想在其中保留所有信息列,只需减少每个人的观察次数。所以,我有一个唯一标识符和大约 50 个人。我只想选择 2 个人并且我只想从这 2 个人中选择 500 个数据点。

我的数据框称为wloc08. 有 50 个唯一 ID。我只选择其中 2 个人,但在这 2 个人中,我只需要每个人的 500 个数据点。

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

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

 reduced= subwloc08$ID[1:500,]

不工作。

4

2 回答 2

6

如果您只与 2 个人打交道,则可以分别对每个人进行子集化,然后rbind对每个子集进行 ing:

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"):这将通过查找键等于F07001或的所有行来子集您的数据F07005。还会煽动“by without by”(详见?data.table

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

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

于 2012-09-18T09:32:58.977 回答
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(而不是 的整行subwloc08)的前 500 个值。

如果要对前 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], ]))
于 2012-09-18T09:21:11.053 回答