Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中的列中标识重复的字符串_R_Duplicates_Rows - Fatal编程技术网

在R中的列中标识重复的字符串

在R中的列中标识重复的字符串,r,duplicates,rows,R,Duplicates,Rows,我有一个4列3000行的数据框。我的目标是检查每一行的列中是否有四个不同的字符串。例如: 第一排:希腊-俄罗斯-西班牙-荷兰 第二排:英格兰-德国-德国-伊朗 第三排:荷兰-荷兰-英国-希腊 因此,R应该给我第2行和第3行,因为有重复项。 这可能吗?提前感谢。我们可以使用apply和MARGIN=1循环行,检查每行唯一的元素的长度是否不等于数据集的列数,以获得逻辑向量,这可用于对数据集的行进行子集,该数据集的行中至少有一个重复项 df1[apply(df1, 1, FUN = function(

我有一个4列3000行的数据框。我的目标是检查每一行的列中是否有四个不同的字符串。例如:

第一排:希腊-俄罗斯-西班牙-荷兰
第二排:英格兰-德国-德国-伊朗
第三排:荷兰-荷兰-英国-希腊

因此,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 Try
df1[apply(df1,1,FUN=function(x){x1谢谢。我试了第一个版本(apply)很遗憾,我有多个NA值。不应列出重复的NAs。因此,如果一行是英国-德国-NA-NA,我不想看到这一行。如果您能解决此问题,我将非常高兴。@Lilly我们可以创建一个逻辑索引,将该行中没有NAs的行子集,即此ca中的
i1se,像“Britain-Britain-NA-NA”(复制记录-Britain)这样的行无法识别,但我想列出这些案例……对不起,这有点复杂。@Lilly Try
df1[apply(df1,1,FUN=function(x){x1