【问题标题】:sample data.table rows with different conditions具有不同条件的示例 data.table 行
【发布时间】:2016-06-21 08:21:06
【问题描述】:

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

MRE:

#data.table
trys <- structure(list(keyb = c("x", "x", "x", "x", "x", "y", "y", "y", 
"y", "y"), A = c("1", "", "1", "", "", "1", "", "", "1", "")), .Names = c("keyb", 
"A"), row.names = c(NA, -10L), class = c("data.table", "data.frame"
))
setkey(trys,keyb)

#list with keys
list_try <- structure(list(a = "x", b = c("r", "y","x")), .Names = c("a", "b"))

例如,我可以根据list_try 中出现的元素对data.table 进行子集化:

trys[keyb %in% list_try[[2]]]

我最初的(可能是低效的想法)是尝试链接每个键的两行样本,其中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.tables(一个用于a,一个用于list_try 中的b),每个出现的元素有两行:所以来自a 的data.table将有两行(A 中有数据和没有数据),b 中的数据有四行(A 中有两行数据,两行没有数据)。

如果我可以使这篇文章更清晰,请告诉我

【问题讨论】:

  • 不确定,但也许是这个trys[list_try[[2]], nomatch = 0L, sample(.I, 1L), by = .(keyb, A)]V1 是采样的行索引
  • 对于两个数据集,可能是lapply(list_try, function(x) trys[x, nomatch = 0L, sample(.I, 1L), by = .(keyb, A)])
  • @DavidArenburg 这适用于我的示例数据集,我将针对我的实际数据集调整评论。它正在删除所有其他列(带有相关信息),并且由于某种原因,它为我提供了包含数据的列的两行样本,而不是 1
  • 如果你想保留其他列,只需获取$V1,然后根据trys[trys[list_try[[2]], nomatch = 0L, sample(.I, 1L), by = .(keyb, A)]$V1] 中的索引对数据进行子集化。此外,您的真实数据中有多少 A 中的唯一值?如果A 中的唯一值超过 2 个,则可以将其修改为 trys[list_try[[2]], nomatch = 0L, sample(.I, 1L), by = .(keyb, A != "")]$V1
  • 你想添加一个答案吗,@david?这有效

标签: r data.table sample random-sample


【解决方案1】:

您也可以将A 添加到by 语句中,同时通过修改为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  

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

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  

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 2021-08-06
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2015-11-21
    相关资源
    最近更新 更多