在R中的列中标识重复的字符串
我有一个4列3000行的数据框。我的目标是检查每一行的列中是否有四个不同的字符串。例如: 第一排:希腊-俄罗斯-西班牙-荷兰在R中的列中标识重复的字符串,r,duplicates,rows,R,Duplicates,Rows,我有一个4列3000行的数据框。我的目标是检查每一行的列中是否有四个不同的字符串。例如: 第一排:希腊-俄罗斯-西班牙-荷兰 第二排:英格兰-德国-德国-伊朗 第三排:荷兰-荷兰-英国-希腊 因此,R应该给我第2行和第3行,因为有重复项。 这可能吗?提前感谢。我们可以使用apply和MARGIN=1循环行,检查每行唯一的元素的长度是否不等于数据集的列数,以获得逻辑向量,这可用于对数据集的行进行子集,该数据集的行中至少有一个重复项 df1[apply(df1, 1, FUN = function(
第二排:英格兰-德国-德国-伊朗
第三排:荷兰-荷兰-英国-希腊 因此,R应该给我第2行和第3行,因为有重复项。
这可能吗?提前感谢。我们可以使用
apply
和MARGIN=1
循环行,检查每行唯一的元素的长度是否不等于数据集的列数,以获得逻辑向量,这可用于对数据集的行进行子集,该数据集的行中至少有一个重复项
df1[apply(df1, 1, FUN = function(x) length(unique(x)))!=ncol(df1),]
# col1 col2 col3 col4
#2 England Germany Germany Iran
#3 Netherlands Netherlands Britain Greece
另一个选择是基于正则表达式的方法(应该更快),其中我们粘贴每行的元素,并grep
使用正则表达式获取重复字符串行的索引,以将行子集
df1[grep("(\\b\\S+\\b)(?=.*\\1+)", do.call(paste, df1), perl = TRUE),]
# col1 col2 col3 col4
# 2 England Germany Germany Iran
# 3 Netherlands Netherlands Britain Greece
基准
df2我们可以使用apply
和MARGIN=1
循环行,检查每行唯一的元素的长度是否不等于数据集的列数,以获得逻辑向量,这可用于对数据集的行进行子集,该数据集的行中至少有一个重复项
df1[apply(df1, 1, FUN = function(x) length(unique(x)))!=ncol(df1),]
# col1 col2 col3 col4
#2 England Germany Germany Iran
#3 Netherlands Netherlands Britain Greece
另一个选择是基于正则表达式的方法(应该更快),其中我们粘贴每行的元素,并grep
使用正则表达式获取重复字符串行的索引,以将行子集
df1[grep("(\\b\\S+\\b)(?=.*\\1+)", do.call(paste, df1), perl = TRUE),]
# col1 col2 col3 col4
# 2 England Germany Germany Iran
# 3 Netherlands Netherlands Britain Greece
基准
df2使用dplyr
和tidyr
library(dplyr)
library(tidyr)
df_new <- df %>%
mutate(row = row_number()) %>%
gather(key, value, -row) %>%
group_by(row, value) %>%
mutate(n = n()) %>%
mutate(duplicate = ifelse(n > 1, TRUE, FALSE)) %>%
# STOP HERE IF YOU WANT TO SEE DUPLICATES
filter(duplicate == TRUE) %>%
ungroup() %>%
# RUN DISTINCT IF YOU JUST WANT TO SEE ROWS WITH DUPES
distinct(row)
库(dplyr)
图书馆(tidyr)
df_新%
变异(行=行编号())%>%
聚集(键,值,-行)%>%
分组依据(行,值)%>%
变异(n=n())%>%
突变(重复=ifelse(n>1,真,假))%>%
#如果你想看到重复的,请停在这里
筛选器(重复==TRUE)%>%
解组()%>%
#如果只想查看包含重复项的行,请运行DISTINCT
不同(行)
具有3000行的基准测试
dfL <- Reduce(rbind, list(df)[rep(1L, times=1000)])
system.time( ... )
# user system elapsed
# 0.004 0.000 0.004
dfL使用dplyr
和tidyr
library(dplyr)
library(tidyr)
df_new <- df %>%
mutate(row = row_number()) %>%
gather(key, value, -row) %>%
group_by(row, value) %>%
mutate(n = n()) %>%
mutate(duplicate = ifelse(n > 1, TRUE, FALSE)) %>%
# STOP HERE IF YOU WANT TO SEE DUPLICATES
filter(duplicate == TRUE) %>%
ungroup() %>%
# RUN DISTINCT IF YOU JUST WANT TO SEE ROWS WITH DUPES
distinct(row)
库(dplyr)
图书馆(tidyr)
df_新%
变异(行=行编号())%>%
聚集(键,值,-行)%>%
分组依据(行,值)%>%
变异(n=n())%>%
突变(重复=ifelse(n>1,真,假))%>%
#如果你想看到重复的,请停在这里
筛选器(重复==TRUE)%>%
解组()%>%
#如果只想查看包含重复项的行,请运行DISTINCT
不同(行)
具有3000行的基准测试
dfL <- Reduce(rbind, list(df)[rep(1L, times=1000)])
system.time( ... )
# user system elapsed
# 0.004 0.000 0.004
dfL@akrun您是100%对的,但是3000行的代码非常友好:)可能是,但是您需要写的行数还是有点让我担心。@akrun您是100%对的,但是3000行的代码非常友好:)可能是,但是您需要写的行数还是有点让我担心。谢谢。我尝试了第一个版本(apply),效果非常好。不幸的是,我有多个NA值。不应列出重复的NAs。所以如果一排是英国-德国-不-不,我不想看到这一排。如果您能解决这个问题,我将非常高兴。@Lilly我们可以创建一个逻辑索引,将该行中没有NAs的行子集,即i1在这种情况下,不会识别像“Britain-Britain-NA-NA”(重复记录-Britain)这样的行,但我想列出这些情况。。。对不起,有点复杂。@Lilly Trydf1[apply(df1,1,FUN=function(x){x1谢谢。我试了第一个版本(apply)很遗憾,我有多个NA值。不应列出重复的NAs。因此,如果一行是英国-德国-NA-NA,我不想看到这一行。如果您能解决此问题,我将非常高兴。@Lilly我们可以创建一个逻辑索引,将该行中没有NAs的行子集,即此ca中的i1se,像“Britain-Britain-NA-NA”(复制记录-Britain)这样的行无法识别,但我想列出这些案例……对不起,这有点复杂。@Lilly Trydf1[apply(df1,1,FUN=function(x){x1