【发布时间】:2013-12-27 19:42:25
【问题描述】:
这是问题Deleting random subset of observations within a group of variables that have a certain value 的一个细微变化。 我正在寻找的变化是如何删除行子集,每次分组标准更改时,删除的行数都会更改。这是一个简单的示例数据集,其中包含一列数值和一个数字分组列(分组列也可以是“AA1”、“AA2”等因素)。
set.seed(23)
df<-data.frame(a=round(rnorm(500,mean=20,sd=2)))
df$group<-seq(from = 1, to = length (df),by=5)
数据表(table(df$a) 给出以下结果:
group: 14 15 16 17 18 19 20 21 22 23 24 25
count: 1 7 13 24 65 87 91 91 59 42 12 8
例如:当分组值等于15时,我想随机删除4行;当 group = 16 时,随机删除 7 行;当 group = 17 时,随机删除 7 行。对于每个分组变量,此过程继续进行。
这是我目前的解决方案:
(dfindex<-which(df$a==15)) ##create index that meets the grouping variable criteria
(delete.df.index<-sample(dfindex,4)) ##select number of rows to randomly remove
dfnew<-df[-delete.df.index,] ##create a new data frame and delete the randomly selected rows
在新创建的数据框上重复上述步骤:
(dfindex<-which(dfnew$a==16)) ##create another index from the grouping variable criteria
(delete.df.index<-sample(dfindex,3)) ##select rows to randomly delete
dfnew<-dfnew[-delete.df.index,] ##delete rows
重复分组变量的每个组合和要删除的随机选择的行。
(dfindex<-which(dfnew$a==17))
(delete.df.index<-sample(dfindex,7))
dfnew<-dfnew[-delete.df.index,]
在这个例子中,我有 12 个分组级别。简单但耗时的方法是复制/粘贴/编辑分组变量和行删除的每个组合的代码。我想知道是否可以使用表格(或类似的东西)来指定分组值和要删除的特定分组变量的行数:
要删除的组和行的示例表。
Group Number of rows to randomly remove
14 0
15 4
16 3
17 7
18 40
19 23
提前感谢您的任何意见。
【问题讨论】:
-
除非我遗漏了什么,否则为什么不使用
for循环呢? IE。扫描您提供的最后一个表中的行,例如dfnew$a==Group[i]sample(dfindex,Numberofrows[i])。而且,您可能还想将您的dfnews 保存在一个列表中,即mylist[[i]] <- dfnew。
标签: r