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