Удаление повторяющегося значения в строке

1

У меня есть два столбца во фрейме данных, которые могли или не могли скопировать значения в них. Если второй столбец имеет то же значение, что и первый столбец, я хотел бы заменить это значение значением NULL или строкой, указывающей, что значение было заменено. Если значения разные, я хочу сохранить оба этих значения. Например: я хочу взять это

col_1      col_2
a            a
a            b
b            d
c            c
c            d
c            c
a            a

И превратите это в:

col_1      col_2
a            NULL
a            b
b            d
c            NULL
c            d
c            NULL
a            NULL

Как я могу это сделать?

Теги:
string dataframe
CodeFix

3 ответа

2
Лучший ответ

Вы также можете попробовать:

#Code
df$col_2 <- ifelse(df$col_2==df$col_1,'NULL',df$col_2)

Выход:

df
  col_1 col_2
1     a  NULL
2     a     b
3     b     d
4     c  NULL
5     c     d

Некоторые использованные данные:

#Data
df <- structure(list(col_1 = c("a", "a", "b", "c", "c"), col_2 = c("a", 
"b", "d", "c", "d")), class = "data.frame", row.names = c(NA, 
-5L))

Другой вариант может быть, используя правильныйR синтаксис:

#Code2
df$col_2[df$col_2==df$col_1]<-'NULL'

Тот же результат.

С использованиемifelse() подход, получаем вот что:

df
  col_1 col_2
1     a  NULL
2     a     b
3     b     d
4     c  NULL
5     c     d
6     c  NULL
7     a  NULL
Поделиться
Источник
  • 0
    Это не работает, если повторяется комбинация col_1 и col_2. Как я могу изменить ваш ответ, чтобы приспособиться к этому?
  • 0
    @Alokin Подход ifelse() может работать. Не могли бы вы привести образец данных по упомянутой вами проблеме?
  • 1
    @Alokin Я выполнил оба кода над вашими новыми данными, и они дали результат, который вы включили. В чем проблема?
  • 0
    Думаю, это была моя ошибка. Я покопался в коде. Ваш ответ работает, спасибо Дак.
  • 0
    @ Алокин Отлично! Большое спасибо, также поддержал ваш вопрос, так как он хорошо исследован и определен :)
1

По значению NULL я предполагаю, что вам нужно NA, если вам нужна фактическая строка NULL, вы можете использовать NULL вместо NA_character_, как в ответе Duck.

library(dplyr)
df %>% 
mutate(col_2 = case_when(col_1 == col_2 ~ NA_character_, TRUE ~ col_2))
# A tibble: 5 x 2
# Rowwise: 
  col_1 col_2
  <chr> <chr>
1 a     NA   
2 a     b    
3 b     d    
4 c     NA   
5 c     d    

На основе новых данных:

df %>% mutate(col_2 = case_when(col_1 == col_2 ~ NA_character_, TRUE ~ col_2))
# A tibble: 7 x 2
# Rowwise: 
  col_1 col_2
  <chr> <chr>
1 a     NA   
2 a     b    
3 b     d    
4 c     NA   
5 c     d    
6 c     NA   
7 a     NA   

Использованные данные:

df
# A tibble: 7 x 2
  col_1 col_2
  <chr> <chr>
1 a     a    
2 a     b    
3 b     d    
4 c     c    
5 c     d    
6 c     c    
7 a     a    
Поделиться
Источник
  • 0
    Это работает, только если в таблице нет повторений. Что бы вы сделали, если бы некоторые из пар повторялись так: col_1 col_2 <chr> <chr> 1 aa 2 ab 3 bd 4 cc 5 cd 6a a
  • 0
    @Alokin, обновили мой ответ, проверьте, работает ли он так же.
0

Мы можем использоватьdata.table методы, которые быстрые и эффективные

library(data.table)
setDT(df)[col_1 == col_2, col_2 := 'NULL']

-выход

df
#   col_1 col_2
#1:     a  NULL
#2:     a     b
#3:     b     d
#4:     c  NULL
#5:     c     d

данные

df <- structure(list(col_1 = c("a", "a", "b", "c", "c"), col_2 = c("a", 
"b", "d", "c", "d")), class = "data.frame", row.names = c(NA, 
-5L))
Поделиться
Источник

Другие вопросы

CodeFix
Цитата дня

"Завидую тестировщикам: все хотят с ними дружить."

Эндрю Таненбаум