Сохранение уникальных значений для отдельного идентификатора в кадре данных в R - PullRequest
1 голос
/ 25 февраля 2020

Очень простой c вопрос! Я много раз пытался найти поиск и использовать свой собственный мозг, но в конце концов мне пришлось прийти сюда ..:)

Хорошо, вот примерный кадр данных

df<- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3),
            quarter=c(1,2,3,4,1,2,3,4,1,2,3,4),
            year=c(2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2015),
            value=c(2.75,2.75,2.75,2.75,2.90,2.90,2.90,2.90,2.21,2.21,2.21,2.21))

> df

   id quarter year value
1   1       1 2015  2.75
2   1       2 2015  2.75
3   1       3 2015  2.75
4   1       4 2015  2.75
5   2       1 2015  2.90
6   2       2 2015  2.90
7   2       3 2015  2.90
8   2       4 2015  2.90
9   3       1 2015  2.21
10  3       2 2015  2.21
11  3       3 2015  2.21
12  3       4 2015  2.21

Мне нужно уникальное значение для каждого идентификатора. Итак, я использую это -

df$value[duplicated(df$value)]<-NA

И я получаю то, что мне нужно.

> df
   id quarter year value
1   1       1 2015  2.75
2   1       2 2015    NA
3   1       3 2015    NA
4   1       4 2015    NA
5   2       1 2015  2.90
6   2       2 2015    NA
7   2       3 2015    NA
8   2       4 2015    NA
9   3       1 2015  2.21
10  3       2 2015    NA
11  3       3 2015    NA
12  3       4 2015    NA

Теперь давайте скажем, что у меня есть новый фрейм данных с более похожими значениями -

df<- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3),
                quarter=c(1,2,3,4,1,2,3,4,1,2,3,4),
                year=c(2015,2015,2015,2015,2016,2016,2016,2016,2015,2015,2015,2015),
                value=c(2.75,2.75,2.75,2.75,2.75,2.75,2.75,2.75,2.21,2.21,2.21,2.21))

Если я использую тот же код, я получу данные, отсутствующие для ID 2 а также.

Как я могу сохранить уникальные значения для каждого идентификатора в год ??

Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Вот базовое решение R с использованием ave + duplicated

df <- within(df,value <- ave(value,
                             id, 
                             year,
                             FUN = function(v) ifelse(duplicated(v),NA,v)))

таким, что

> df
   id quarter year value
1   1       1 2015  2.75
2   1       2 2015    NA
3   1       3 2015    NA
4   1       4 2015    NA
5   2       1 2015  2.90
6   2       2 2015    NA
7   2       3 2015    NA
8   2       4 2015    NA
9   3       1 2015  2.21
10  3       2 2015    NA
11  3       3 2015    NA
12  3       4 2015    NA
1 голос
/ 25 февраля 2020

Использование duplicated на cbind id и year вместо value должно дать желаемый результат:

df[duplicated(cbind(df$id, df$year)), "value"]<-NA

Использование этого решения на вашем втором data.frame, который дал пропущенные строки:

df<- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3),
                quarter=c(1,2,3,4,1,2,3,4,1,2,3,4),
                year=c(2015,2015,2015,2015,2016,2016,2016,2016,2015,2015,2015,2015),
                value=c(2.75,2.75,2.75,2.75,2.75,2.75,2.75,2.75,2.21,2.21,2.21,2.21))


df[duplicated(cbind(df$id, df$year)), "value"]<-NA

Возвращает:

     id quarter year value
  1   1       1 2015  2.75
  2   1       2 2015    NA
  3   1       3 2015    NA
  4   1       4 2015    NA
  5   2       1 2016  2.75
  6   2       2 2016    NA
  7   2       3 2016    NA
  8   2       4 2016    NA
  9   3       1 2015  2.21
  10  3       2 2015    NA
  11  3       3 2015    NA
  12  3       4 2015    NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...