【问题标题】:Calculate row similarity percentage pair wise and add it as a new colum逐对计算行相似性百分比并将其添加为新列
【发布时间】:2020-02-14 00:27:43
【问题描述】:

我有一个像这个样本这样的日期框架,我想找到相似的行(不重复)并按明智的方式计算相似度。我找到this solution,但我想保留所有列并将相似性百分比添加为新变量。我的目标是找到相似度最高的记录。我该怎么办?

样本数据集

df <- tibble::tribble(
     ~date, ~user_id, ~Station_id, ~location_id, ~ind_id, ~start_hour, ~start_minute, ~start_second, ~end_hour, ~end_minute, ~end_second, ~duration_min,
  20191015, 19900234,         242,            2,    "ac",           7,            25,             0,         7,          30,          59,             6,
  20191015, 19900234,         242,            2,    "ac",           7,            31,             0,         7,          32,          59,             2,
  20191015, 19900234,         242,            2,    "ac",           7,            33,             0,         7,          38,          59,             6,
  20191015, 19900234,         242,            2,    "ac",           7,            39,             0,         7,          40,          59,             2,
  20191015, 19900234,         242,            2,    "ac",           7,            41,             0,         7,          43,          59,             3,
  20191015, 19900234,         242,            2,    "ac",           7,            44,             0,         7,          45,          59,             2,
  20191015, 19900234,         242,            2,    "ac",           7,            47,             0,         7,          59,          59,            13,
  20191015, 19900234,         242,            2,    "ad",           7,            47,             0,         7,          59,          59,            13,
  20191015, 19900234,         242,            2,    "ac",           8,             5,             0,         8,           6,          59,             2,
  20191015, 19900234,         242,            2,    "ad",           8,             5,             0,         8,           6,          59,             2,
  20191015, 19900234,         242,            2,    "ac",           8,             7,             0,         8,           8,          59,             2,
  20191015, 19900234,         242,            2,    "ad",           8,             7,             0,         8,           8,          59,             2,
  20191015, 19900234,         242,            2,    "ac",          16,            26,             0,        16,          55,          59,            30,
  20191015, 19900234,         242,            2,    "ad",          16,            26,             0,        16,          55,          59,            30,
  20191015, 19900234,         242,            2,    "ad",          17,             5,             0,        17,           6,          59,             2,
  20191015, 19900234,         242,            2,    "ac",          17,             5,             0,        17,          23,          59,            19,
  20191015, 19900234,         242,            2,    "ad",          17,             7,             0,        17,          15,          59,             9,
  20191015, 19900234,         242,            2,    "ad",          17,            16,             0,        17,          22,          59,             7,
  20191015, 19900234,         264,            2,    "ac",          17,            24,             0,        17,          35,          59,            12,
  20191015, 19900234,         264,            2,    "ad",          17,            25,             0,        17,          35,          59,            11,
  20191016, 19900234,         242,            1,    "ac",           7,            12,             0,         7,          14,          59,             3,
  20191016, 19900234,         242,            1,    "ad",           7,            13,             0,         7,          13,          59,             1,
  20191016, 19900234,         242,            1,    "ac",          17,            45,             0,        17,          49,          59,             5,
  20191016, 19900234,         242,            1,    "ad",          17,            46,             0,        17,          48,          59,             3,
  20191016, 19900234,         242,            2,    "ad",           7,            14,             0,         8,           0,          59,            47,
  20191016, 19900234,         242,            2,    "ac",           7,            15,             0,         8,           0,          59,            47
  )

行比较函数

row_cf <- function(x, y, df){
  sum(df[x,] == df[y,])/ncol(df)
}

函数输出

# 1) Create all possible row combinations
# 2) Rename 
# 3) Run through each row
# 4) Calculate similarity

expand.grid(1:nrow(df), 1:nrow(df)) %>% 
  rename(row_1 = Var1, row_2 = Var2) %>% 
  rowwise() %>% 
  mutate(similarity = row_cf(row_1, row_2, df))


# A tibble: 676 x 3
   row_1 row_2 similarity
   <int> <int>      <dbl>
 1     1     1      1    
 2     2     1      0.75 
 3     3     1      0.833
 4     4     1      0.75 
 5     5     1      0.75 
 6     6     1      0.75 
 7     7     1      0.75 
 8     8     1      0.667
 9     9     1      0.583
10    10     1      0.5 

编辑: 我想在数据中找到类似的行,比如这里

【问题讨论】:

  • 只是为了澄清一下,示例数据中有 26 行,并且将计算 26x26 = 676 个相似度值(成对比较)-您是否希望最终数据帧具有 676 行,并且对于每个相似度值,从原始数据框中添加可能选择的变量列?你能提供你最终想要的输出最终应该是什么样子吗?
  • @ben 我的目标是找到相似的行,我编辑了这个问题。它可能不需要计算 676 个相似度值。我有兴趣标记类似的行。假设如果排列/排序数据,那么如果第 2 行与第 3 行相似(相似不重复),那么我用相似率或其他方式标记它
  • 您只想要最相似的行吗?您仍然需要进行所有比较(实际上是 26 * 25,因为您不需要将一行与自身进行比较)。但是,您是否想添加 2 个新列,给出最相似的行并给出其相似度分数?还是别的什么?
  • @Gregor 是的,我正在寻找具有相似度得分最相似的行

标签: r datatable tidyverse similarity


【解决方案1】:

使用您的“函数输出”,将其命名为sim。消除自比较,然后保留按row_1分组的最大相似行:

sim = sim %>% 
  filter(row_1 != row_2) %>%
  group_by(row_1) %>% 
  slice(which.max(similarity))

然后您可以将这些添加到您的原始数据中:

df %>% mutate(row_1 = 1:n()) %>%
  left_join(sim)

row_2 列给出最相似行的行号,similarity 给出其相似度得分。 (您可能需要改进这些列名。)

【讨论】:

  • 你指的是“函数输出”中的自我比较?
  • 任何时候一行都与自身进行比较。就像第一行一样,row_1 = 1row_2 = 1,您的相似度列告诉使用,第一行与自身相比得分为1。那没用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多