Преобразовать повторяющиеся значения в столбце в NA - PullRequest
0 голосов
/ 20 июня 2019

Я хотел бы преобразовать повторяющиеся значения в векторе в 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 

_____ РЕДАКТИРОВАТЬ с помощью решения "Base R" / "dplyr" ___
Решение Ронак Шаха работает.Вот он, внутри рабочего процесса 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 ]

1 голос
/ 20 июня 2019

Используя 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)
0 голосов
/ 20 июня 2019

Мы можем использовать data.table

library(data.table)
setDT(df)[duplicated(rleid(problem)), problem := NA][]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...