这必须是一个简单的答案。我想将我的数据子集用于测试目的。我有一个数据框,我想保留所有信息列,只需简单地减少每个人的观察数量。所以,我有一个独特的标识符和大约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,]
不起作用。
答案 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]]
分解最后一步的语法:
c("F07001", "F07005")
:这会通过查找密钥等于F07001
或F07005
的所有行来对数据进行分组。它还会煽动“不经”(详见?data.table
)
.SD[1:500]
:这将通过选择1:500行来对.SD
对象(子集化data.table)进行子集化。
编辑由于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], ]))