基于R中的相似性在数据帧中子集行/列

时间:2017-03-07 06:59:26

标签: r dataframe subset similarity

我有一个数据帧“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在数据帧“df”和12的数据帧中标识出来。模式“a b”重复大部分时间。

步骤2: 基于步骤1中的多数模式,R子集一个数据帧,其中只包含步骤1中包含多数模式的行。

步骤3: R输出Step2的新的子设置数据帧。

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

3 个答案:

答案 0 :(得分:1)

您是否需要最常见组合的副本?如果没有,那么使用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

答案 1 :(得分:0)

究竟是什么&#34;相似性&#34;在您的查询中 - 只找到最常见的行并仅采取该行?如果是,您只需要按所有变量分组并按出现次数排序

如果您正在谈论列中类似但不匹配的文字,则需要查看编辑距离(此包适用于任务https://cran.r-project.org/web/packages/stringdist/stringdist.pdf

答案 2 :(得分:0)

根据您更新的问题,您可以使用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步,要求找到多数模式
    注意,在 tie 的情况下,即,两个或更多个组合具有相同的最大出现次数,则返回所有组合。 OP没有具体说明他想如何处理这种情况。
  5. 计数将被删除,因为不再需要它们。
  6. 最后,连接原始df,以便选择与多数模式匹配的df的所有行。 nomatch = 0指定内部联接。这样就完成了第2步,也可能第3步(但我不清楚这一点,请参阅comment
    请注意,id列中的行号保留在结果中,无需任何额外工作。对于df中的任何其他列,情况也是如此。
  7. 数据

    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]