我有一个数据帧“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的新的子设置数据帧。
是否有可以执行此操作的程序包或我可以构建的功能?任何指导都非常有价值。谢谢
答案 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
<强>解释强>
setDT(df)
将data.frame强制转换为data.table
而不进行复制。df
,以便选择与多数模式匹配的df
的所有行。 nomatch = 0
指定内部联接。这样就完成了第2步,也可能第3步(但我不清楚这一点,请参阅comment。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]