Здесь можно использовать data.table
. Мы преобразуем «data.frame» в «data.table» (setDT(DF)
). Сгруппированный по столбцу «Пользователь», мы выбираем все строки, кроме первого (tail(.SD, -1)
), где .SD
- Subset of Data.table
. Но это также удалит строку, если для группы «Пользователь» есть только одна строка. Мы можем избежать этого, используя условие if/else
, заявив, что if
число строк больше 1 (.N>1
), мы удаляем первую строку или else
возвращаем строку (.SD
).
library(data.table)
setDT(DF)[, if(.N>1) tail(.SD,-1) else .SD , by = User]
# User No
#1: A 2
#2: A 3
#3: A 4
#4: B 2
#5: C 1
#6: D 1
Или подобный вариант, как в @ MrFlick-х dplyr код будет использовать логическое условие с duplicated
и .N
(количество строк). Мы создаем столбец «N», проверяя группы «Пользователь», которые имеют одно наблюдение (.N==1
), на следующем шаге мы подмножаем строки, которые имеют значение TRUE для N или duplicated
для «Пользователь». duplicated
возвращает TRUE
значения для duplicate
строк, оставляя первое значение как FALSE
.
setDT(DF)[DF[, N:=.N==1, by = User][, N|duplicated(User)]][,N:=NULL][]
Или base R
вариант будет использовать ave
, чтобы получить логический индекс («indx2»), проверяя, если length
для каждой группы «User» является 1 или нет. Мы можем использовать это вместе с duplicated
, как описано выше, для подмножества набора данных.
indx2 <- with(DF, ave(seq_along(User), User, FUN=length)==1)
DF[duplicated(DF$User)|indx2,]
# User No
#3 A 2
#4 A 3
#5 A 4
#6 C 1
#7 B 2
#8 D 1
Что вы подразумеваете под «Я не увенчался успехом с использованием дублированной функции»? Что вы пробовали до сих пор? Пожалуйста, поделитесь некоторым кодом, или этот вопрос обязательно будет закрыт. –