根据R中数据框的数字列查找样本拆分中的重叠
Posted
技术标签:
【中文标题】根据R中数据框的数字列查找样本拆分中的重叠【英文标题】:Find overlap in sample split based on numeric columns of data frame in R 【发布时间】:2021-12-16 01:58:33 【问题描述】:我有一个看起来像这样的 data.frame:
df <- data.frame (names = LETTERS[1:10],
rep1 = sample(1:5, 10, replace=TRUE),
rep2 = sample(1:5, 10, replace=TRUE),
rep3 = sample(1:5, 10, replace=TRUE),
rep4= sample(1:5, 10, replace=TRUE))
print(df)
names rep1 rep2 rep3 rep4
1 A 2 2 5 4
2 B 5 5 5 1
3 C 3 4 2 5
4 D 5 3 5 3
5 E 2 3 2 4
6 F 5 5 2 4
7 G 1 3 1 3
8 H 2 2 3 3
9 I 1 1 4 3
10 J 3 1 3 5
我需要知道的: 某些名称(“样本”)是否在不同的代表中组合在一起(按数字)?
但是,数字(1到5)是否不同无关紧要,只要特定名称属于同一组(例如A,E,H属于rep1中的第2组。它们是否在另一个rep中分组在一起?)。我想知道是否有分组的“模式”,例如某些名称是否更频繁地同时出现/出现在一个集合中?
有人知道如何实现这一目标吗?
【问题讨论】:
您的预期输出如何? 说实话,这已经是我的第一次挣扎了。我想知道获得重叠印象的最佳方式是什么。也许是一个表,其中行名和列名都为“名称”,还有一个数字表示该名称与另一个名称在同一组中的次数?或者有没有情节或集群解决方案? 【参考方案1】:也许这个可以帮助你找到一种模式:
library(dplyr)
library(tidyr)
df %>%
pivot_longer(-names) %>%
group_by(name, value) %>%
summarise(grouping = paste(names, collapse = ", "),
.groups = "drop") %>%
pivot_wider(names_from = name,
values_from = grouping)
返回
# A tibble: 5 x 5
value rep1 rep2 rep3 rep4
<int> <chr> <chr> <chr> <chr>
1 1 D, E, J NA I A, C, E
2 2 A, B F, H A, C, D, F G
3 4 F, H D, E H D, H, I
4 5 C, G, I A, I, J B, J B, F
5 3 NA B, C, G E, G J
value
是代表的原始组。
数据
structure(list(names = c("A", "B", "C", "D", "E", "F", "G", "H",
"I", "J"), rep1 = c(2L, 2L, 5L, 1L, 1L, 4L, 5L, 4L, 5L, 1L),
rep2 = c(5L, 3L, 3L, 4L, 4L, 2L, 3L, 2L, 5L, 5L), rep3 = c(2L,
5L, 2L, 2L, 3L, 2L, 3L, 4L, 1L, 5L), rep4 = c(1L, 5L, 1L,
4L, 1L, 5L, 2L, 4L, 4L, 3L)), class = "data.frame", row.names = c(NA,
-10L))
【讨论】:
非常感谢@Martin Gal。我认为在我的可重现示例中,此解决方案会有所帮助!但是,我的问题是我的真实数据框更大,名称更复杂更长。所以我试了一下,但是真的不能用肉眼扫描这个……【参考方案2】:这是一个返回每个rep*
的最大重叠的解决方案。
library(dplyr)
library(tidyr)
df %>%
pivot_longer(-names, names_to = "rep") %>%
group_by(rep, value) %>%
summarise(n = n(),
names = paste(names, collapse = ", ")) %>%
filter(n == max(n))
#`summarise()` has grouped output by 'name'. You can #override using the `.groups` argument.
## A tibble: 7 x 4
## Groups: name [4]
# rep value n names
# <chr> <int> <int> <chr>
#1 rep1 4 4 B, C, G, I
#2 rep2 3 3 A, D, I
#3 rep2 4 3 B, F, J
#4 rep3 2 3 D, G, H
#5 rep3 3 3 E, F, J
#6 rep3 5 3 A, B, I
#7 rep4 1 3 B, C, J
数据
从问题中重复测试数据创建代码,但使用伪 RNG 种子集,以使结果可重现。
set.seed(2021)
df <- data.frame (names = LETTERS[1:10],
rep1 = sample(1:5, 10, replace=TRUE),
rep2 = sample(1:5, 10, replace=TRUE),
rep3 = sample(1:5, 10, replace=TRUE),
rep4= sample(1:5, 10, replace=TRUE))
【讨论】:
以上是关于根据R中数据框的数字列查找样本拆分中的重叠的主要内容,如果未能解决你的问题,请参考以下文章