当前位置: 首页 > 知识库问答 >
问题:

用列表删除组中具有特定值的变量的随机子集

邓昀
2023-03-14

这是对删除一组具有一定值的变量中的随机观察子集问题的一个细微变化。我正在寻找的变体是如何删除行的子集,其中删除的行数在分组条件每次更改时都会更改。这是一个简单的示例数据集,其中有一列数值和一个数值分组列(分组列也可以是“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行;当组= 16时,随机删除7行;当组 = 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

感谢您的任何意见。

共有2个答案

陶瀚玥
2023-03-14

在仔细阅读了Codoremifa提供的答案后,我注意到了一些小细节,这些细节可能值得其他人记录下来。使用Codoremifa提供的答案,我做了一些小的修改,并添加了一些额外的代码来说明一些重要的细节。基本上,注意合并步骤,并决定如何处理合并步骤生成的NA值。

set.seed(23)
df<-data.frame(a=round(rnorm(50,mean=20,sd=2)))

# create table of no of rows that need to be removed per each a
noofrowsremove <- read.table(textConnection(
 'a toremove
21 0  

17 1  
19 2  
20 2  
24 2  
16 1
22 1
18 3'), header = TRUE)

##excluded values 23 and 15 from the above df to illustrate an example below
#Keep value 21 and just assigned it a 0 (i.e., do not remove any values of 21).

library(data.table)

# assign random number in a new column, this will help in sampling
df$tosample <- runif(50) #can also use runif(nrow(df))

# convert data.frame to data.table, grouped operations are easier on data.table
dt <- data.table(df)

# rank the tosample column within each unique a value
dt[,samplerank := rank(tosample), by = 'a']

# merge the filtering no of rows with dt.  Be careful with merge options.
dt1 <- merge(dt,noofrowsremove, by = 'a') #46 rows
dt2 <- merge(dt,noofrowsremove, by = 'a',all=TRUE) #51 rows. 

#Notice slight differences in the number of rows between dt1 and dt2 
#In dt2, value 23 in the toremove column is "NA" because 23 was not included in noofrowsremove
nrow(dt1) #46 rows
nrow(dt2) #51 rows

##to keep values with "NA" change the "NA" to a 0
dt2$toremove[is.na(dt2$toremove)] <- 0 #assign NA to 0

# filter out rows that have samplerank columns <= the no of rows that need to be removed
dttrimmed1 <- dt1[samplerank > toremove] #36 rows.  toremove values with NA are exlcuded
dttrimmed2 <- dt2[samplerank > toremove] #40 rows.  Kept values with NA reasigned to 0
羊刚捷
2023-03-14

试着运行这个-

set.seed(23)
df<-data.frame(a=round(rnorm(50,mean=20,sd=2)))

# create table of no of rows that need to be removed per each a
noofrowsremove <- read.table(textConnection(
'a toremove
21 1  
23 2  
15 2  
17 1  
19 2  
20 2  
24 2  
16 1
22 1
18 3'), header = TRUE)

library(data.table)

# assign random number in a new column, this will help in sampling
df$tosample <- runif(50)

# convert data.frame to data.table, grouped operations are easier on data.table
dt <- data.table(df)
# rank the tosample column within each unique a value
dt[,samplerank := rank(tosample), by = 'a']
# merge the filtering no of rows with dt
dt <- merge(dt,noofrowsremove, by = 'a')
# filter out rows that have samplerank columns <= the no of rows that need to be removed
dttrimmed <- dt[samplerank > toremove]
 类似资料:
  • 问题内容: 有没有一种方法可以在变量中传递值列表,并在IN()语句中使用它来对照传入的值列表检查字段? 我唯一能想到的就是这样: 谢谢。 问题答案: TD14支持名为STRTOK_SPLIT_TO_TABLE的漂亮表函数:

  • 期望: 1. 定义: 设离散型随机变量$$X$$的分布律为:$$P{X=x_i}=p_k, k=1,2,...$$,若级数$$\displaystyle\sum_{k=1}^{\infty} x_k p_k$$绝对收敛,则称该级数的和为随机变量$$X$$的数学期望(mean),记为$$E(X)$$。即 $$ E(X)=\displaystyle\sum_{k=1}^{\infty} x_k p_k

  • 本文向大家介绍如何从C ++ STL向量中删除具有特定值的项?,包括了如何从C ++ STL向量中删除具有特定值的项?的使用技巧和注意事项,需要的朋友参考一下 擦除功能用于从C ++ STL向量中删除具有特定值的项。 算法 范例程式码 输出结果

  • 我有一个变量,它是由逗号分隔的单词列表,如下所示: 单词列表可以包含比上述示例更多或更少的单词。 如何随机化以获得这样的东西: word1、word5、word2、word3、word4 或 word4、word5、word3、word1、word2

  • 问题内容: 我有几个使用SimpleXML访问的具有不同属性的相同元素: 我需要删除ID为“ A12” 的特定 seg 元素,该怎么做?我尝试遍历 seg 元素并未 设置 特定的元素,但这不起作用,元素仍然存在。 问题答案: 尽管SimpleXML提供了一种删除XML节点的方法,但其修改功能还是受到一定限制。另一种解决方案是使用DOM扩展。dom_import_simplexml()将帮助您将转换

  • 问题内容: 什么是有效的(可能用Matlab术语向量化)生成随机数的零和特定比例的零的方法?特别是和Numpy在一起? 由于我的情况很特殊,我的代码是: 但是,至少在K和N是自然数的情况下,是否有任何内置函数可以更有效地处理此问题? 问题答案: 如果我正确理解了您的问题,您可能会得到一些有关numpy.random.shuffle的帮助