Секвенирование и оценка дубликатов в векторе - PullRequest
2 голосов
/ 08 ноября 2019

Я пытаюсь создать переменную, которая определяет, является ли строка в векторе первым появлением, в верхних трех или более трех. Например:

В наборе данных ниже у меня есть имя (будет больше имен), текст и переменная dup. Я хочу, чтобы переменная dup определяла, появляется ли текст впервые (источник), находится ли он в пределах первых трех вхождений (FirstThree) или появился более трех раз (MoreThanThree). Я также должен сделать это для каждого человека ... но я думаю, что могу понять эту часть. Заранее спасибо за любую помощь!

name =c("T","T","T","T","T","T","T","T","T","T")
text =c("a","b","a","a","b","c","a","a","b","a")
dup =c("origin","origin","FirstThree","FirstThree","FirstThree","origin","MoreThanThree","MoreThanThree","FirstThree","MoreThanThree")
dfA = data.frame(name,text,dup)

 name text           dup
1     T    a        origin
2     T    b        origin
3     T    a    FirstThree
4     T    a    FirstThree
5     T    b    FirstThree
6     T    c        origin
7     T    a MoreThenThree
8     T    a MoreThenThree
9     T    b    FirstThree
10    T    a MoreThenThree

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Вы можете использовать data.table::rowid с двумя ifelse чеками

dfA[, ict := {
        r <- rowid(text)
        ifelse(r == 1, 'origin', 
        ifelse(r <= 3, 'FirstThree', 
               'MoreThanThree'))}
    , by = name]

dfA
#     name text           dup           ict
#  1:    T    a        origin        origin
#  2:    T    b        origin        origin
#  3:    T    a    FirstThree    FirstThree
#  4:    T    a    FirstThree    FirstThree
#  5:    T    b    FirstThree    FirstThree
#  6:    T    c        origin        origin
#  7:    T    a MoreThanThree MoreThanThree
#  8:    T    a MoreThanThree MoreThanThree
#  9:    T    b    FirstThree    FirstThree
# 10:    T    a MoreThanThree MoreThanThree

Вы также можете использовать cut. Разница лишь в том, что это создает фактор, а не характер. Может быть полезно, если у вас более 3 категорий

dfA[, ict := cut(rowid(text), c(0, 1, 3, Inf), 
                 labels = c('origin', 'FirstThree', 'MoreThanThree'))
    , by = name]
0 голосов
/ 09 ноября 2019

В dplyr мы можем сравнить row_number() в операторе case_when.

library(dplyr)

dfA %>%
  group_by(text) %>%
  mutate(row = row_number(), 
         dup = case_when(row == 1 ~ "origin", 
                         row <= 3 ~ "FirstThree", 
                         TRUE ~ "MoreThenThree"))

#   name  text    row dup          
#   <fct> <fct> <int> <chr>        
# 1 T     a         1 origin       
# 2 T     b         1 origin       
# 3 T     a         2 FirstThree   
# 4 T     a         3 FirstThree   
# 5 T     b         2 FirstThree   
# 6 T     c         1 origin       
# 7 T     a         4 MoreThenThree
# 8 T     a         5 MoreThenThree
# 9 T     b         3 FirstThree   
#10 T     a         6 MoreThenThree

Мы можем удалить столбец row позже, если в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...