Пометить уникальные значения по нескольким группам в фрейме данных - PullRequest
0 голосов
/ 07 августа 2020

У меня есть большой фрейм данных в R, в котором пользователям было поручено описывать объекты в сцене. Мне нужно было 3 уникальных пользователя на сцену, однако некоторые сцены описывались более 3 раз. Я пытаюсь сохранить первых трех уникальных пользователей и удалить остальных.

Игрушечные данные (в реальном наборе данных гораздо больше строк и столбцов)

user <- c("A", "A", "A", "B", "B", "C", "C", "D", "E", "E", "F", "F", "F")
scene <- c("library", "library", "library", "park", "park", "library", "library", "park", "library", "library", "library", "library", "library")
object <- c("book", "book", "lamp", "dog", "cat", "book", "lamp", "dog", "desk", "desk", "book", "lamp", "lamp")
index <- c(1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2)
dat <- data.frame(user, scene, object, index)

user     scene      object      index
A        library    book        1
A        library    book        2
A        library    lamp        1
B        park       dog         1
B        park       cat         1
C        library    book        1
C        library    lamp        1
D        park       dog         1
E        library    desk        1
E        library    desk        2
F        library    book        1
F        library    lamp        1
F        library    lamp        2
...      ...        ...         ...

Например, здесь A, B и C были первыми пользователями, описавшими сцену library. Так что теперь описание F не нужно. Моя основная проблема заключается в том, что, хотя я могу получить общее количество уникальных пользователей, я не знаю, как пометить их как 1, 2, 3, и т. Д. c, чтобы отбросить значения, превышающие 3. .

Желаемый результат

user     scene      object      index   count
A        library    book        1       1
A        library    book        2       1
A        library    lamp        1       1
B        park       dog         1       1
B        park       cat         1       1
C        library    book        1       2
C        library    lamp        1       2
D        park       dog         1       2
E        library    desk        1       3
E        library    desk        2       3

Это было полезно, но сгруппировано только по одному столбцу, поэтому я не смог применить его здесь: R - Группировать по переменной, а затем присвоить уникальный ID

1 Ответ

1 голос
/ 07 августа 2020

Для каждого user вы можете создать переменную count, используя match, а затем filter выводить значения только до count <= 3:

library(dplyr)

dat %>%
  group_by(scene) %>%
  mutate(count = match(user, unique(user))) %>%
  filter(count <= 3)

#   user  scene   object index count
#   <chr> <chr>   <chr>  <dbl> <int>
# 1 A     library book       1     1
# 2 A     library book       2     1
# 3 A     library lamp       1     1
# 4 B     park    dog        1     1
# 5 B     park    cat        1     1
# 6 C     library book       1     2
# 7 C     library lamp       1     2
# 8 D     park    dog        1     2
# 9 E     library desk       1     3
#10 E     library desk       2     3

То же самое в data.table будет быть:

library(data.table)
setDT(dat)[, count := match(user, unique(user)), scene]
dat[count <= 3] 

и основанием R:

dat$count <- with(dat, ave(user, scene, FUN = function(x) match(x, unique(x))))
subset(dat, count <= 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...