Замена всех повторяющихся элементов в столбце с NA в R - PullRequest
1 голос
/ 24 марта 2020

Как заменить все повторяющиеся элементы в столбце на в ? Это пример подмножества данных, с которыми я работаю:

> df.1
         V1      V2      V3      V4
X1    4D+44  18D+30 125D+44   4D+48
X2     NONE    NONE 125D+44    NONE
X3     NONE    NONE 125D+44    NONE
X4  29D+139 18D+124 125D+44  4D+133
X5  29D+139  5D+164 125D+44    NONE
X6  30D+174  9D+194    NONE    NONE
X7   6D+227  4D+225    NONE 39D+217
X8     NONE    NONE    NONE 39D+217
X9   4D+285    NONE    NONE    NONE
X10    NONE    NONE    NONE    NONE

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

4D+44 NA NA NA NA 30D+174 6D+227 NA 4D+285 NA

Ближайший результат, который я могу получить, - это использование duplicated()

> df.1$V1[duplicated(df.1$V1)] <- NA
> df[df == "NONE"] <- NA

Но это приводит к V1 выглядит так, сохраняя первое значение повторяющихся элементов.

4D+44 NA NA 29D+139 NA 30D+174 6D+227 NA 4D+285 NA

Есть ли способ распознать и заменить все повторяющиеся элементы?

Спасибо за ваш ответ.

1 Ответ

0 голосов
/ 24 марта 2020

Мы можем использовать duplicated для создания логического индекса и использовать его для replace каждого из столбцов с NA

df1[] <- lapply(df1, function(x) 
       replace(x, duplicated(x)|duplicated(x, fromLast = TRUE),  NA))

или с dplyr

library(dplyr)
df1 %>%
  mutate_all(~ replace(., duplicated(.)|duplicated(., fromLast = TRUE), NA))

data

df1 <- structure(list(V1 = c("4D+44", "NONE", "NONE", "29D+139", "29D+139", 
"30D+174", "6D+227", "NONE", "4D+285", "NONE"), V2 = c("18D+30", 
"NONE", "NONE", "18D+124", "5D+164", "9D+194", "4D+225", "NONE", 
"NONE", "NONE"), V3 = c("125D+44", "125D+44", "125D+44", "125D+44", 
"125D+44", "NONE", "NONE", "NONE", "NONE", "NONE"), V4 = c("4D+48", 
"NONE", "NONE", "4D+133", "NONE", "NONE", "39D+217", "39D+217", 
"NONE", "NONE")), class = "data.frame", row.names = c("X1", "X2", 
"X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10"))
...