将列中的重复值转换为NA

时间:2019-06-20 09:12:49

标签: r dplyr

我想将向量中的重复值转换为NA,以便保留每个新值首次出现的位置。

我可以找到很多有关如何解决删除重复行的帖子,但是找不到解决该问题的帖子。

您能帮我将“问题”列转换为“需求”列中的值吗?

dplyr解决方案是首选。

library(tidyverse)

df <- tribble(
  ~frame, ~problem, ~desire,
  1,  NA, NA, 
  2, "A", "A",
  3, NA, NA,
  4, "B", "B", 
  5, "B", NA, 
  6, NA, NA, 
  7, "C", "C",
  8, "C", NA, 
  9, NA, NA,
  10, "E", "E")

df
# A tibble: 10 x 3
   frame problem desire
   <dbl> <chr>   <chr> 
 1     1 NA      NA    
 2     2 A       A     
 3     3 NA      NA    
 4     4 B       B     
 5     5 B       NA    
 6     6 NA      NA    
 7     7 C       C     
 8     8 C       NA    
 9     9 NA      NA    
10    10 E       E 

_____ EDIT使用“ Base R” /“ dplyr”解决方案___
Ronak Shah的解决方案有效。在任何人感兴趣的情况下,它都在dplyr工作流程中:

df %>% 
  mutate(
    solved = replace(problem, duplicated(problem), NA))

# A tibble: 10 x 4
   frame problem desire solved
   <dbl> <chr>   <chr>  <chr> 
 1     1 NA      NA     NA    
 2     2 A       A      A     
 3     3 NA      NA     NA    
 4     4 B       B      B     
 5     5 B       NA     NA    
 6     6 NA      NA     NA    
 7     7 C       C      C     
 8     8 C       NA     NA    
 9     9 NA      NA     NA    
10    10 E       E      E 

2 个答案:

答案 0 :(得分:1)

使用data.table rleid,我们可以将replace的值duplicated变成NA

library(data.table)
df$answer <- replace(df$problem, duplicated(rleid(df$problem)), NA)

#   frame problem desire answer
#   <dbl> <chr>   <chr>  <chr> 
# 1     1 NA      NA     NA    
# 2     2 A       A      A     
# 3     3 NA      NA     NA    
# 4     4 B       B      B     
# 5     5 B       NA     NA    
# 6     6 NA      NA     NA    
# 7     7 C       C      C     
# 8     8 C       NA     NA    
# 9     9 NA      NA     NA    
#10    10 E       E      E     

对于完整的基本R选项,我们可以使用rle代替rleid来创建序列

df$answer <- replace(df$problem, duplicated(with(rle(df$problem), 
                     rep(seq_along(values), lengths))), NA)

如所示示例中,如果所有相似的值始终在一起,我们只能使用duplicated

df$problem <- replace(df$problem, duplicated(df$problem), NA)

答案 1 :(得分:0)

我们可以使用data.table

library(data.table)
setDT(df)[duplicated(rleid(problem)), problem := NA][]