【问题标题】:Selecting all rows that match a criteria selected randomly within dplyr选择与 dplyr 中随机选择的条件匹配的所有行
【发布时间】:2019-12-17 02:53:17
【问题描述】:

我正在尝试选择重复测量数据集中属于随机选定的一组人的所有行。我试图完全在tidyverse(为了我自己的教化)中完成它,但发现自己不得不依靠基本的 R 函数。下面是我结合使用基本 R 和 dplyr 命令的方法。

set.seed(145)
df <- data.frame(id = rep(letters[1:10], each = 4),
                 score = rnorm(40))
ids <- sample(unique(df$id), 3)
smallDF <- df %>% dplyr::filter(id %in% ids)
smallDF

#    id      score
# 1   a  0.6869129
# 2   a  1.0663631
# 3   a  0.5367006
# 4   a  1.9060287
# 5   c  1.1677516
# 6   c  0.7926794
# 7   c -1.2135038
# 8   c -1.0056141
# 9   d  0.2085696
# 10  d  0.4461776
# 11  d -0.6208060
# 12  d  0.4413429

我可以使用dplyrid标识符中随机抽样...

df %>% distinct(id) %>% sample_n(3)

#   id
# 1  e
# 2  c
# 3  b

...但是输出是数据帧/小标题的事实使我很难进入下一步,然后我通过随机选择的 id 标识符过滤原始 df

有人可以帮忙吗?

【问题讨论】:

  • 使用基本 R 函数并没有错,仅仅因为你使用了一些 dplyr 函数并不意味着你不能或不应该也使用基本函数
  • 谢谢@Camille。两者都知道不会有什么坏处吧?
  • 对,这就是为什么我认为很多人认为他们必须(甚至可以)只使用 tidyverse 函数很奇怪

标签: r dplyr


【解决方案1】:

您可以对原始df 执行left_join 以获取所有随机选择的ID 行

library(dplyr)
set.seed(123)
df %>% distinct(id) %>% sample_n(3) %>% left_join(df)

#Joining, by = "id"
#   id  score
#1   b  1.063
#2   b  1.370
#3   b  0.528
#4   b  0.403
#5   f  0.343
#6   f -1.286
#7   f -0.534
#8   f  0.597
#9   c  1.168
#10  c  0.793
#11  c -1.214
#12  c -1.006

【讨论】:

    【解决方案2】:
    df %>% filter(id %in% sample(levels(id),3))
    

    【讨论】:

    • 巧妙的解决方案!
    猜你喜欢
    • 2016-02-20
    • 2021-11-12
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多