首页 > 解决方案 > 尝试在两列中保留非重复值时如何在R中使用数据框的条件过滤

问题描述

我有一个这样组织的数据框:

df <- data.frame(ID=c(rep("1111", 16),rep("2222", 16)),
                 subID=rep(c(rep("100", 4), rep("200", 4), rep("300", 4), rep("400", 4)),2),
                 instance=rep(1:4, 8),
                 feature=rep(letters[1:4], 8)
                  )

看起来像这样:

> df
     ID subID instance feature
1  1111   100        1       a
2  1111   100        2       b
3  1111   100        3       c
4  1111   100        4       d
5  1111   200        1       a
6  1111   200        2       b
7  1111   200        3       c
8  1111   200        4       d
9  1111   300        1       a
10 1111   300        2       b
11 1111   300        3       c
12 1111   300        4       d
13 1111   400        1       a
14 1111   400        2       b
15 1111   400        3       c
16 1111   400        4       d
17 2222   100        1       a
18 2222   100        2       b
19 2222   100        3       c
20 2222   100        4       d
21 2222   200        1       a
22 2222   200        2       b
23 2222   200        3       c
24 2222   200        4       d
25 2222   300        1       a
26 2222   300        2       b
27 2222   300        3       c
28 2222   300        4       d
29 2222   400        1       a
30 2222   400        2       b
31 2222   400        3       c
32 2222   400        4       d

在真实数据集中,所有的 subID 都是从同一个 ID 采集的唯一样本。您可以将它们视为在同一位置的四个时间点收集的样本。子 ID 100 到 400 每个都与 4 个实例之一相关联(即 100 = 2、200 = 4、300 = 3 和 400 = 1),并且对于整体 ID 是唯一的。但我不知道实际的链接,需要进行手动记录审查以分配链接。为了让我的审查更快,我想保留每个 subID 和每个实例之一,如下所示:

   ID  subID  instance  feature  truesubID
1 1111   100        1       a       
2 1111   200        2       b       
3 1111   300        3       c       
4 1111   400        4       d       
5 2222   100        1       a       
6 2222   200        2       b       
7 2222   300        3       c       
8 2222   400        4       d          

这样,当我进行手动记录审查时,我知道可能的 subID 编号是什么,它们属于哪个 ID,并且我知道要交叉引用多少个实例。然后我会将真实的 subID 填写到最后一列。(例如,对于 ID=1111,subID=100 实际上是 instance=4,等等)

你知道我如何过滤第一个df看起来像第二个吗?

谢谢!

标签: rdplyrfiltering

解决方案


您的数据框中有一个模式。您可以每隔五行删除一次以获得所需的结果:

df1 <- df %>% 
  group_by(ID) %>% 
  slice(which(row_number() %% 5 == 1))

这给了你这个:

在此处输入图像描述

编辑:由于扩展信息:如果每个 ID 具有可变数量的实例的解决方案:**

df1 <- df %>%
  group_split(ID) %>%
  purrr::map_df(~.x %>% group_by(subID) %>% 
                  slice(cur_group_id())
                )

推荐阅读