【发布时间】:2019-09-03 18:11:20
【问题描述】:
数据
我在 R 中有一个具有以下结构的数据框:
ID Type Group Text
100 A 1 Lorem ipsum dolor sit amet
103 A 1 Lorem ipsum dolor sit amet
105 A 1 consectetur adipiscing eli
106 A 1 et dolore magna aliqua. Ut
107 B 1 Lorem ipsum dolor sit amet
209 B 1 Lorem ipsum dolor sing eli
300 C 1 Lorem ipsum dolor sit amet
501 C 1 Lorem ipsum dolor sit amet
503 A 2 Lorem ipsum dolor sit amet
711 A 2 consectetur adipiscing eli
799 B 2 Lorem ipsum dolor sit amet
811 B 2 Lorem ipsum dolor sit amet
812 C 3 Lorem ipsum dolor sit amet
820 C 3 Lorem ipsum dolor sing eli
831 C 3 sed do eiusmod temporo eli
可以用这段代码重现:
test_df <- data.frame(
"ID" = c(100, 103, 105, 106, 107, 209, 300, 501, 503, 711, 799, 811, 812, 820, 831),
"Type" = c('A', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'A', 'A', 'B', 'B', 'C', 'C', 'C'),
"Group" = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3),
"Text" = c('Lorem ipsum dolor sit amet', 'Lorem ipsum dolor sit amet', 'consectetur adipiscing eli', 'et dolore magna aliqua. Ut', 'Lorem ipsum dolor sit amet', 'Lorem ipsum dolor sing eli', 'Lorem ipsum dolor sit amet', 'Lorem ipsum dolor sit amet', 'Lorem ipsum dolor sit amet', 'consectetur adipiscing eli', 'Lorem ipsum dolor sit amet', 'Lorem ipsum dolor sit amet', 'Lorem ipsum dolor sit amet', 'Lorem ipsum dolor sing eli', 'sed do eiusmod temporo eli')
)
我要做什么
我正在尝试编写一个执行以下操作的函数:
- 遍历数据框中的所有行,并根据“类型”和“组”的交叉识别样本中的所有子集(例如 A1、A2、B1、B2...)
- 对于每个子集,比较该子集中的所有文本。
- 然后,识别高度相似的文本(即重复文本),将它们移动到单独的数据框中(所有重复文本都应最终位于同一数据框中,无论子集如何),然后将它们从原始数据框中删除。
基本上,该函数应该通过一次运行一个子集来识别每个子集中高度相似的文本。
我目前所拥有的
下面的代码允许我在整个数据帧上运行这个计算,没有子集:
library(stringdist)
library(dplyr)
temp_var <- stringdistmatrix(test_df$Text, test_df$Text) # Calculate similarities
temp_var <- which((temp_var <= 10), arr.ind = TRUE) # Identify texts with 10 or fewer differences (i.e. duplicates)
temp_var <- as.data.frame(temp_var)
temp_var <- temp_var %>%
filter(temp_var$row != temp_var$col) # Removes cases where a text is compared with itself
x <- temp_var[,1]
x <- unique(x) # Create list of row numbers of duplicate texts
duplicate_texts <- test_df[x, ] # Save the duplicate texts
test_df_2 <- test_df[!test_df$ID %in% duplicate_texts$ID,] # Remove the duplicate texts from the original dataframe
我想弄清楚的是如何一次在样本的一个子集上运行此代码。
原始数据框很大,有数百个子集,数十万个文件,以及明显较长的文本,因此子集是必要的。此外,每次计算新的相似度矩阵时,我都需要删除或覆盖之前的相似度矩阵,因为它们的大小变得相当大。
【问题讨论】:
-
编写一个函数,将数据框作为参数(仅用于一个子集)并进行计算。测试一个小子集。然后你做
your_data %>% group_by(Type, Group) %>% group_map(your_function)
标签: r function dataframe subset fuzzy-comparison