尝试在两列中保留非重复值时如何在 R 中使用数据框的条件过滤
How to use conditional filtering of a data frame in R when trying to retain non-duplicated values in two columns
我有一个这样组织的数据框:
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采集的唯一样本。您可以将它们视为在同一位置的四个时间点收集的样本。 subID 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 使其看起来像第二个吗?
谢谢!
您的数据框中有一个模式。您可以删除每五行以获得您想要的结果:
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())
)
我有一个这样组织的数据框:
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采集的唯一样本。您可以将它们视为在同一位置的四个时间点收集的样本。 subID 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 使其看起来像第二个吗?
谢谢!
您的数据框中有一个模式。您可以删除每五行以获得您想要的结果:
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())
)