R 示例data.table具有不同条件的行

R 示例data.table具有不同条件的行,r,data.table,sample,random-sample,R,Data.table,Sample,Random Sample,我有一个data.table,有多个列。其中一列当前用作“键”(例如,keyb)。另一列(比如A)中可能有数据,也可能没有数据。我想提供一个向量,每个键随机采样两行,-如果该键出现在向量中,其中一行包含a中的数据,而另一行不包含 MRE: 我最初的想法(可能是低效的想法)是尝试将每个键链接两行的样本,其中a列有数据或没有数据,然后合并。但它不起作用: #here I was trying to sample rows based on whether A has data or not #her

我有一个data.table,有多个列。其中一列当前用作“键”(例如,
keyb
)。另一列(比如
A
)中可能有数据,也可能没有数据。我想提供一个向量,每个键随机采样两行,-如果该键出现在向量中,其中一行包含
a
中的数据,而另一行不包含

MRE:

我最初的想法(可能是低效的想法)是尝试将每个键链接两行的样本,其中
a
列有数据或没有数据,然后合并。但它不起作用:

#here I was trying to sample rows based on whether A has data or not
#here for rows where A has no data
trys[keyb %in% list_try[[2]]][nchar(A)==0][sample(.N, 2), ,by = keyb]
#here for rows where A has data
trys[keyb %in% list_try[[2]]][nchar(A)==1][sample(.N, 2), ,by = keyb]
在这种情况下,我的预期输出将是两个data.table(一个用于
a
,另一个用于
b
),每个出现的元素有两行:因此
a
中的data.table将有两行(一行在a中有数据,一行在a中没有数据),而
b
中的data.table将有四行(两行在a中有数据,两行没有数据)


请让我知道,如果我能使这篇文章更清晰

您也可以通过语句将
A
添加到
,同时通过修改为
A!=“”
,与二进制联接结合(同时添加
nomatch=0L
以删除不匹配项),然后您可以通过这两个聚合器从行索引
.I
中采样,然后从原始数据集中提取子集

对于单个子集的情况

trys[trys[list_try[[2]], nomatch = 0L, sample(.I, 1L), by = .(keyb, A != "")]$V1]
#    keyb A
# 1:    y 1
# 2:    y  
# 3:    x 1
# 4:    x  

对于更一般的情况,当您想要根据密钥列表创建单独的数据集时,您可以轻松地将其嵌入到
lappy

lapply(list_try, 
       function(x) trys[trys[x, nomatch = 0L, sample(.I, 1L), by = .(keyb, A != "")]$V1]) 
# $a
# keyb A
# 1:    x 1
# 2:    x  
# 
# $b
# keyb A
# 1:    y 1
# 2:    y  
# 3:    x 1
# 4:    x  

不确定,但可能这
trys[list_try[[2]],nomatch=0L,sample(.I,1L),by=(keyb,A)]
V1
是两个数据集的采样行索引,可能是
Lappy(list_try,function(x)trys[x,nomatch=0L,sample(.I,1L),by=(keyb,A)])
@DavidArenburg这对我的样本数据集有效,我将根据我的实际数据集调整注释。它会删除所有其他列(包含相关信息),出于某种原因,它会为包含数据的列提供两行样本,而不是1如果您想保留其他列,只需获取
$V1
,然后根据该索引对数据进行子集,如
trys[list_try[[2]],nomatch=0L,sample(.I,1L),by=。(keyb,A)]$V1
,例如。另外,您在实际数据中的
A
中有多少个唯一值?如果
A
中有两个以上的唯一值,您可以将其修改为
trys[list_try[[2]],nomatch=0L,sample(.I,1L),by=(keyb,A!=“”)]$V1
您想添加一个答案吗,@david?这很有效
trys[trys[list_try[[2]], nomatch = 0L, sample(.I, 1L), by = .(keyb, A != "")]$V1]
#    keyb A
# 1:    y 1
# 2:    y  
# 3:    x 1
# 4:    x  
lapply(list_try, 
       function(x) trys[trys[x, nomatch = 0L, sample(.I, 1L), by = .(keyb, A != "")]$V1]) 
# $a
# keyb A
# 1:    x 1
# 2:    x  
# 
# $b
# keyb A
# 1:    y 1
# 2:    y  
# 3:    x 1
# 4:    x