Вот несколько вариантов
Используя базовую R apply
мы replace
значения duplicated
до NA
для каждой строки
df[] <- t(apply(df, 1, function(x) replace(x, duplicated(x), NA)))
df
# label val val1
#1 a x z
#2 b <NA> <NA>
#3 c <NA> d
Или другойальтернативное использование dplyr
и tidyr
состоит в том, чтобы сначала создать новый столбец, представляющий row_number()
кадра данных, gather
в длинном формате, group_by
каждая строка, replace
duplicated
значение до NA
и spread
обратно в широкоформатный формат.
library(dplyr)
library(tidyr)
df %>%
mutate(row = row_number()) %>%
gather(key, value, -row) %>%
group_by(row) %>%
mutate(value = replace(value, duplicated(value), NA)) %>%
spread(key, value) %>%
ungroup %>%
select(-row)
# A tibble: 3 x 3
# label val val1
# <chr> <chr> <chr>
#1 a x z
#2 b NA NA
#3 c NA d