如何根据(随机选择的)列的唯一值过滤数据框?

How can I filter a dataframe based on (randomly selected) unique values of a column?

我在这里阅读了一些关于如何根据给定列中的特定值进行过滤的文章。但是,我感兴趣的是我是否可以过滤随机选择的列的唯一值。为了更好地理解我的问题,请考虑以下示例数据框:

MeasurementPoint <- c(1,2,1,2,3,3,4,4,6,7,6,7)
subject <- c(1,1,1,1,2,2,3,3,4,4,4,4)
MeasurementMethod <- c("A","A", "B", "B", "A","B", "A","B","A","A", "B","B")
value <- c(-0.06, 0.11,-0.11,-0.01.-0.13, 0.02, -0.08, 0.09, 0.05, 0.04, -0.03, -0.02)
df1 <- data.frame(MeasurementPoint, subject,MeasurementMethod, value)
df1
 MeasurementPoint subject MeasurementMethod value
         1            1            A        -0.06
         2            1            A         0.11
         1            1            B        -0.11
         2            1            B        -0.01
         3            2            A        -0.13
         3            2            B         0.02
         4            3            A        -0.08
         4            3            B         0.09
         6            4            A         0.05
         7            4            A         0.04
         6            4            B        -0.03
         7            4            B        -0.02

一些是在不同的对象上用两种不同的MeasurementMethod和不同的MeasurementPoint测量的s,例如他们身上有很多斑点。

有些科目有不止一个 测量点,例如科目 #1 和 #4。其余人身上只有一个MeasurementPoint,只有MeasurementMethod因人而异(对象#2​​和#3)。

我只想为每个主题过滤一个 MeasurementPoint 并保留其余部分。这种选择应该是“随机”完成的。作为示例,以下数据框将是感兴趣的结果:

  MeasurementPoint subject MeasurementMethod value
                2       1                 A  0.11
                2       1                 B -0.01
                3       2                 A -0.13
                3       2                 B  0.02
                4       3                 A -0.08
                4       3                 B  0.09
                6       4                 A  0.05
                6       4                 B -0.03

请注意,第一个主题的 MeasurementPoint = 2 和最后一个主题的 MeasurementPoint = 6 的选择应该随机发生。

我们可以 group_by subject 列和 filter 行匹配由 sample 生成的随机 MeasurementPoint 值。

library(dplyr)

df1 %>% 
  group_by(subject) %>% 
  filter(MeasurementPoint == sample(MeasurementPoint, 1))

# A tibble: 8 × 4
# Groups:   subject [4]
  MeasurementPoint subject MeasurementMethod value
             <dbl>   <dbl> <chr>             <dbl>
1                1       1 A                 -0.06
2                1       1 B                 -0.11
3                3       2 A                 -0.13
4                3       2 B                  0.02
5                4       3 A                 -0.08
6                4       3 B                  0.09
7                6       4 A                  0.05
8                6       4 B                 -0.03