Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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 - Fatal编程技术网

R-处理重复行

R-处理重复行,r,duplicates,R,Duplicates,我有一个如下所示的数据帧: Head1 Head2 10 46 10 52 10 46 20 53 20 53 30 12 30 12 30 52 我需要输出如下: Head1 Head2 10 46 10 52 10 # 20 53 20 # 30 12 30 # 30 52 我尝试了unique(Head2),它只返回Head2的唯一值 例2: 输入: 输出: 我们可以尝试使用data.table。将'data.frame'转换为'data.table'

我有一个如下所示的数据帧:

Head1 Head2
10  46
10  52
10  46
20  53
20  53
30  12
30  12
30  52
我需要输出如下:

Head1 Head2
10  46
10  52
10  #
20  53
20  #
30  12
30  #
30  52
我尝试了
unique(Head2)
,它只返回
Head2
的唯一值

例2:

输入:

输出:


我们可以尝试使用
data.table
。将'data.frame'转换为'data.table'(
setDT(df1)
),按'Head1'分组,并指定'i'(
duplicated(Head2)
),将'Head2'中的重复元素分配给'NA'。如果将其更改为
#
,则可能会导致将
numeric
列的类更改为
character

library(data.table)
setDT(df1)[duplicated(Head2), Head2 := NA_integer_ , by = Head1]
df1
#    Head1 Head2
#1:    10    46
#2:    10    52
#3:    10    NA
#4:    20    53
#5:    20    NA
#6:    30    12
#7:    30    NA
#8:    30    13
基于更新的示例和预期输出

setDT(df1)[df1[,duplicated(.SD)], Head2 := NA_integer_]
df1
#    Head1 Head2
#1:    10    46
#2:    10    52
#3:    10    NA
#4:    20    53
#5:    20    NA
#6:    30    12
#7:    30    NA
#8:    30    52
更新 使用新的数据集

setDT(df2)[df2[ , duplicated(.SD)], Head2 := "#"]
df2
#   Head1         Head2
#1:    10 solution fhdd
#2:    10      solution
#3:    11      solution
#4:    11            NA
#5:    11      thid djd
#6:    11             #
#7:    11             #
#8:    11             #
数据
df2我们可以尝试使用
data.table
。将'data.frame'转换为'data.table'(
setDT(df1)
),按'Head1'分组,并指定'i'(
duplicated(Head2)
),将'Head2'中的重复元素分配给'NA'。如果将其更改为
#
,则可能会导致将
numeric
列的类更改为
character

library(data.table)
setDT(df1)[duplicated(Head2), Head2 := NA_integer_ , by = Head1]
df1
#    Head1 Head2
#1:    10    46
#2:    10    52
#3:    10    NA
#4:    20    53
#5:    20    NA
#6:    30    12
#7:    30    NA
#8:    30    13
基于更新的示例和预期输出

setDT(df1)[df1[,duplicated(.SD)], Head2 := NA_integer_]
df1
#    Head1 Head2
#1:    10    46
#2:    10    52
#3:    10    NA
#4:    20    53
#5:    20    NA
#6:    30    12
#7:    30    NA
#8:    30    52
更新 使用新的数据集

setDT(df2)[df2[ , duplicated(.SD)], Head2 := "#"]
df2
#   Head1         Head2
#1:    10 solution fhdd
#2:    10      solution
#3:    11      solution
#4:    11            NA
#5:    11      thid djd
#6:    11             #
#7:    11             #
#8:    11             #
数据
df2使用base-R:

df$Head2 <- unlist(by(df[,-1], df[,1], FUN=function(x) replace(x,duplicated(x),NA)))
##  Head1 Head2
##1    10    46
##2    10    52
##3    10    NA
##4    20    53
##5    20    NA
##6    30    12
##7    30    NA
##8    30    13

如果
df
的两列都是
字符
,并且OP希望在
df$Head1
组中替换
df$Head2
中的重复项,则:

df$Head2 <- unlist(by(df[,-1], df[,1], FUN=function(x) replace(as.character(x),duplicated(x),'#')))
##  Head1 Head2
##1    10    46
##2    10    52
##3    10     #
##4    20    53
##5    20     #
##6    30    12
##7    30     #
##8    30    13
df$Head2使用base-R:

df$Head2 <- unlist(by(df[,-1], df[,1], FUN=function(x) replace(x,duplicated(x),NA)))
##  Head1 Head2
##1    10    46
##2    10    52
##3    10    NA
##4    20    53
##5    20    NA
##6    30    12
##7    30    NA
##8    30    13

如果
df
的两列都是
字符
,并且OP希望在
df$Head1
组中替换
df$Head2
中的重复项,则:

df$Head2 <- unlist(by(df[,-1], df[,1], FUN=function(x) replace(as.character(x),duplicated(x),'#')))
##  Head1 Head2
##1    10    46
##2    10    52
##3    10     #
##4    20    53
##5    20     #
##6    30    12
##7    30     #
##8    30    13
df$Head2试试这个:

df[which(duplicated(df)),]$Head2 <- '#'
df
    Head1 Head2
1    10    46
2    10    52
3    10     #
4    20    53
5    20     #
6    30    12
7    30     #
8    30    13
使用相同的代码,我们可以获得所需的输出:

  Head1 Head2
1    10    46
2    10    52
3    10     #
4    20    53
5    20     #
6    30    12
7    30     #
8    30    52
再次使用新的df

df <- read.table(text='Head1 Head2
                 10  solution_fhdd
                 10  soulution
                 11  solution
                 11  NA
                 11  thid_djd
                 11  NA
                 11  solution
                 11  thid_djd', header=TRUE)

df$Head2 <- as.character(df$Head2) # convert factor to character (if class(Head2)=='factor')
df[which(duplicated(df)),]$Head2 <- '#'
df

  Head1         Head2
1    10 solution_fhdd
2    10     soulution
3    11      solution
4    11          <NA>
5    11      thid_djd
6    11             #
7    11             #
8    11             #
df试试这个:

df[which(duplicated(df)),]$Head2 <- '#'
df
    Head1 Head2
1    10    46
2    10    52
3    10     #
4    20    53
5    20     #
6    30    12
7    30     #
8    30    13
使用相同的代码,我们可以获得所需的输出:

  Head1 Head2
1    10    46
2    10    52
3    10     #
4    20    53
5    20     #
6    30    12
7    30     #
8    30    52
再次使用新的df

df <- read.table(text='Head1 Head2
                 10  solution_fhdd
                 10  soulution
                 11  solution
                 11  NA
                 11  thid_djd
                 11  NA
                 11  solution
                 11  thid_djd', header=TRUE)

df$Head2 <- as.character(df$Head2) # convert factor to character (if class(Head2)=='factor')
df[which(duplicated(df)),]$Head2 <- '#'
df

  Head1         Head2
1    10 solution_fhdd
2    10     soulution
3    11      solution
4    11          <NA>
5    11      thid_djd
6    11             #
7    11             #
8    11             #

df我想用“#”替换每组中的所有重复项,但留下第一个条目。我想用“#”替换每组中的所有重复项,但留下第一个条目。您提供的答案将Head2中的重复值替换为NA,而不考虑Head1条目。但我需要的是,对于相同的Head1值,重复的Head2值应仅替换为NA。我已修改了输入和输出数据集。。请参考我的问题一次again@Rambo更新post@akrun...The我期望的输出是不同的。请理解我的上下文,考虑到Head1的值,副本应替换为“#”。。。例如,对于Head1值“10”,我有3个Head2值(46,52,46)。。。代码应仅检查子集(46,52,46)内的重复项,并将其替换为“#”。我不想扫描整个Head2值,看是否存在每个duplicate@Rambo正如我在文章中提到的,更改为
#
将完全更改列的类,这不是很有用。相反,您应该将其更改为NA。关于副本,我得到了您的预期输出。我只需要替换“#”。我不介意列的类别是否更改。您提供的答案将标题2中的重复值替换为NA,而不考虑标题1条目。但我需要的是,对于相同的Head1值,重复的Head2值应仅替换为NA。我已修改了输入和输出数据集。。请参考我的问题一次again@Rambo更新post@akrun...The我期望的输出是不同的。请理解我的上下文,考虑到Head1的值,副本应替换为“#”。。。例如,对于Head1值“10”,我有3个Head2值(46,52,46)。。。代码应仅检查子集(46,52,46)内的重复项,并将其替换为“#”。我不想扫描整个Head2值,看是否存在每个duplicate@Rambo正如我在文章中提到的,更改为
#
将完全更改列的类,这不是很有用。相反,您应该将其更改为NA。关于副本,我得到了您的预期输出。我只需要替换“#”。我不介意这个专栏的类别是什么changed@sandipan...The我期望的输出是不同的。请理解我的上下文,考虑到Head1的值,副本应替换为“#”。。。例如,对于Head1值“10”,我有3个Head2值(46,52,46)。。。代码应仅检查子集(46,52,46)内的重复项,并将其替换为“#”。我不想扫描整个Head2值,看是否存在每个副本。请参考我上面更新的问题,值基本上不需要是单独的数字。它们可以是字符too@Rambo没有完全理解您的意思,现在代码考虑了Head1和Head2两个列以查找重复项,并且通过您文章中修改的表,我们可以使用相同的代码获得所需的输出。你在说效率吗?@Rambo根据你的新要求,如果类(Head2)是factor,我们只需要在开始处增加一行,将factor转换为character。如果类(Head2)是字符,那么相同的代码也可以工作(用实际输出更新了答案,我猜这是所需的输出)。@sandipan…我期望的输出是不同的。请理解我的上下文,考虑到Head1的值,副本应替换为“#”。。。例如,对于Head1值“10”,我有3个Head2值(46,52,46)。。。代码应仅检查子集(46,52,46)内的重复项,并将其替换为“#”。我不想扫描整个Head2值,看是否存在每个副本。请参考我上面更新的问题,值基本上不需要是单独的数字。它们可以是字符too@Rambo没有完全理解你,现在代码是t