根据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中数据框的数字列查找样本拆分中的重叠的主要内容,如果未能解决你的问题,请参考以下文章

拆分数据框的列并将它们重新组合为一列而不显示空格

将数据拆分为训练/测试文件,以便为两个文件选择至少一个样本

如何根据 Python pandas 中的条件拆分列

根据列标签重塑熊猫中的数据框

如何在R中的数据框的其他行中查找元素

在R中,获取数据框的子集,其中列中的值包含在列表中[重复]