1

我正在寻找找到行子集的可能性(一个子集应包含 6 行),其中多列的值均值最相似。因此,我希望 R 搜索我的 data.frame 并创建每行 6 行的子集,以便最终这些子集彼此最相似。相似性可以用欧几里德距离来衡量(正如@David Robinson 所指出的那样)。

我的数据如下所示:

  TID   Cue1  Cue2  Cue3
  1    2.06   1.90  3.82
  2    5.18   4.13  5.10
  3    5.09   2.85  2.80
  4    1.93   4.14  4.75
  ...   ...    ...   ...       

我现在想知道 R 中是否有一种方法,我发现以下内容:

- 给我例如 4 个子集,每个子​​集包含 6 行,其中 4 个子集在Cue1、Cue2 和 Cue3均值中具有最大可能的相似性(SD 并不重要),而每个子集都包含唯一的行(子集之间没有重复的行)

一个例子是(与我的例子中的数据不匹配):

-子集 1 包含TID 1、TID 6、TID 14、TID 28、TID 39、TID 50,并且该子集具有提示均值(Cue1 = 3,2;Cue2 = 2,5;Cue3 = 4)

-子集 2 包含TID 3、TID 12、TID 20、TID 40、TID 54、TID 59,并且该子集具有提示均值(Cue1 = 3,3;Cue2 = 2,6;Cue3 = 4,1)。

所以这两个子集在提示手段上非常(最)相似。R 现在应该将构成子集的行号(或 TID 值)命名为我。

有没有可能在 R 中做到这一点?

这是我的数据的可重现示例:

    mysamp <- function(n, m, s, lwr, upr, nnorm) {
  set.seed(1)
  samp <- rnorm(nnorm, m, s)
  samp <- samp[samp >= lwr & samp <= upr]
  if (length(samp) >= n) {
    return(sample(samp, n))
  }  
 } 
Cue1 <- mysamp(n=60, m=3, s=1.5, lwr=1, upr=6, nnorm=1000)
Cue2 <- mysamp(n=60, m=3, s=2.5, lwr=1, upr=6, nnorm=1000)
Cue3 <- mysamp(n=60, m=4, s=1.5, lwr=1, upr=6, nnorm=1000)

df <- data.frame(TID= 1:60, Cue1= Cue1, Cue2= Cue2, Cue3= Cue3)
4

1 回答 1

0

这是一个聚类问题,因此您希望通过以下方式解决它:

  • 计算距离矩阵
  • 使用它来构建类似节点组的“树”
  • 提取在树上显示在最低的大小的子集群

距离矩阵和层次聚类可以如下完成:

distances <- dist(df[, -1])
h <- hclust(distances)

有许多方法可以通过算法从树上拉出低簇;因为我习惯于使用 dplyr/purrr/tidyr,所以我将展示一种解决方案。这采用了cutree在每个可能的级别上将树分开的方法,然后找到每组六人组第一次出现的时间。

library(dplyr)
library(tidyr)
library(purrr)

clusterings <- data_frame(ncluster = seq(nrow(df), 1)) %>%
  unnest(membership = map(ncluster, ~ cutree(h, .))) %>%
  group_by(ncluster) %>%
  mutate(row = row_number()) %>%
  ungroup() %>%
  nest(-ncluster, -membership) %>%
  mutate(size = map_dbl(data, nrow)) %>%
  filter(size == 6) %>%
  distinct(membership, .keep_all = TRUE) %>%
  unnest(data) %>%
  mutate(TID = df$TID[row])

在您的数据上,这将返回:

# A tibble: 42 × 5
   ncluster membership  size   row   TID
      <int>      <int> <dbl> <int> <int>
1        29          9     6     9     9
2        29          9     6    30    30
3        29          9     6    39    39
4        29          9     6    41    41
5        29          9     6    43    43
6        29          9     6    57    57
7        21         13     6    15    15
8        21         13     6    20    20
9        21         13     6    25    25
10       21         13     6    29    29
# ... with 32 more rows

因此,(9, 30, 39, 41, 43, 57) 构成了您的第一组 6,而第二组从 (15, 20, 25, 29...)

于 2017-03-08T14:53:52.823 回答