替换 R 中列中的重复元素

Replace duplicate elements in a column in R

我有一个 data.frame 看起来像这样 -

columnA=c(1,2,3,1.1,2.2,3.3,1,2)
columnB=c("a","b","c","d","e","f","g","h")

data=data.frame(columnA, columnB)

  columnA columnB
1     1.0       a
2     2.0       b
3     3.0       c
4     1.1       d
5     2.2       e
6     3.3       f
7     1.0       g
8     2.0       h

我想在 A 列中找到重复项并将它们替换为相同的元素 B 列中的行。我希望 C 列像这样

  columnA columnB  columnC
1     1.0       a    1.0
2     2.0       b    2.0
3     3.0       c    3.0
4     1.1       d    1.1
5     2.2       e    2.2
6     3.3       f    3.3
7     1.0       g     g
8     2.0       h     h

其中 A 列第 7 行和第 8 行重复 1.0 和 3.0 已替换为 B 列第 7 行和第 8 行中的相应元素 [g 和 h]

如有任何帮助,我们将不胜感激。纠结了好久。

您可以在 columnC 中复制 columnA 值,然后将 duplicated 值替换为 columnB

data$columnC <- data$columnA
inds <- duplicated(data$columnA)
data$columnC[inds] <- data$columnB[inds]
data

#  columnA  columnB  columnC
#1     1.0       a        1
#2     2.0       b        2
#3     3.0       c        3
#4     1.1       d      1.1
#5     2.2       e      2.2
#6     3.3       f      3.3
#7     1.0       g        g
#8     2.0       h        h

请注意,您在这里混合了数据类型,因此 columnC 中的值将是 class“字符”。

你可以试试:

data$columnC <- data$columnA
data$columnC[duplicated(data$columnA)]<-data$columnB[duplicated(data$columnA)]
  columnA columnB columnC
1     1.0       a       1
2     2.0       b       2
3     3.0       c       3
4     1.1       d     1.1
5     2.2       e     2.2
6     3.3       f     3.3
7     1.0       g       g
8     2.0       h       h

试试这个

within(data, columnC <- ifelse(duplicated(columnA), columnB, columnA))

  columnA columnB columnC
1     1.0       a       1
2     2.0       b       2
3     3.0       c       3
4     1.1       d     1.1
5     2.2       e     2.2
6     3.3       f     3.3
7     1.0       g       g
8     2.0       h       h

这是另一种选择。按 columnA 分组,如果我们看到第一次出现 A,则使用 A,否则使用 B。

library(tidyverse)

data <- tibble(columnA = c(1,2,3,1.1,2.2,3.3,1,2), 
               columnB =c("a","b","c","d","e","f","g","h"))

data %>%
  group_by(columnA) %>%
  mutate(columnC = ifelse(row_number() == 1, as.character(columnA), columnB))
#> # A tibble: 8 x 3
#> # Groups:   columnA [6]
#>   columnA columnB columnC
#>     <dbl> <chr>   <chr>  
#> 1     1   a       1      
#> 2     2   b       2      
#> 3     3   c       3      
#> 4     1.1 d       1.1    
#> 5     2.2 e       2.2    
#> 6     3.3 f       3.3    
#> 7     1   g       g      
#> 8     2   h       h