基于 R 中的相似性在数据框中进行子设置 rows/columns

Sub-setting rows/columns in a dataframe based on Similarity in R

我有一个数据框 "df" 如下:

       V1 V2
   1   b  a
   2   b  a
   3   a  b
   4   b  a
   5   a  b
   6   a  b
   7   a  b
   8   b  a
   9   a  b
   10  a  b
   11  a  b
   12  b  a

有什么方法可以让我在 R 中自动执行以下 3 个步骤

第 1 步: R 识别出在数据帧的 12 行中 "df" 和模式 "a b" 大部分时间都在重复。

第二步: 基于步骤 1 中的多数模式,R 仅使用包含步骤 1 中多数模式的那些行对数据帧进行子集化。

第三步: R 输出 Step2 的新子集数据帧。

是否有执行此操作的程序包或我可以构建的功能?任何指导都将非常有价值。谢谢

您的查询中的 "similarity" 到底是什么 - 只是找到最常见的行并只使用它?如果是,您只需要按所有变量分组并按出现次数排序

如果您谈论的是相似但不匹配的列中的文本,则需要查看编辑距离(此包非常适合任务 https://cran.r-project.org/web/packages/stringdist/stringdist.pdf

您需要最常见组合的副本吗?如果没有,有一种非常简单的方法可以使用 data.table

library("data.table")

#Create sample data, set seed to have the same output    
set.seed(1)
df <- data.table(V1 = sample(c("a", "b", "c"),10 , replace = T),
                 V2 = sample(c("a", "b", "c"),10 , replace = T),
                 V3 = sample(c("a", "b", "c"),10 , replace = T))

#Subset
cols <- names(df)
df[, .N, by = cols][order(-N)][1,]

输出(N是出现次数):

   V1 V2 V3 N
1:  b  c  b 2

有了你更新后的问题,你可以试试 data.table:

library(data.table)
setDT(df)
cols <- c("V1", "V2")
df[, .N, by = cols][N == max(N)][, N := NULL][df, on = cols, nomatch = 0]
#   V1 V2 id
#1:  a  b  3
#2:  a  b  5
#3:  a  b  6
#4:  a  b  7
#5:  a  b  9
#6:  a  b 10
#7:  a  b 11

说明

  1. setDT(df) 在不复制的情况下将 data.frame 强制转换为 data.table
  2. 已定义相关列以节省输入。
  3. 计算相关列中每个组合的出现次数。
  4. 只保留出现次数最多的组合。这就完成了 Q 的第 1 步,它要求找到多数模式
    请注意,在 并列 的情况下,即两个或多个组合具有相同的最大出现次数,将返回所有组合。 OP 没有具体说明他想如何处理这个案子。
  5. 这些计数已删除,因为它们不再需要。
  6. 最后,连接原始 df,以便选择 df 中匹配多数模式的所有行。 nomatch = 0 指定内部联接。这完成了 第 2 步,也许还有 第 3 步(但我不清楚,请参阅
    请注意,id 列中的行号保留在结果中,无需任何额外操作。 df 中的任何其他附加列也是如此。

数据

df <- fread("id    V1 V2
   1   b  a
   2   b  a
   3   a  b
   4   b  a
   5   a  b
   6   a  b
   7   a  b
   8   b  a
   9   a  b
   10  a  b
   11  a  b
   12  b  a")
# EDIT: By request of the OP, the row number (id) should be kept
# df[, id := NULL]