Удалить дублирующиеся строки на основе двух столбцов типа «символ» в R - PullRequest
2 голосов
/ 24 октября 2019

У меня есть фрейм данных, и я хочу удалить строки с дублированными строками в двух столбцах (с именами «Вверх» и «Вниз»). Если некоторые строки имеют повторяющиеся строковые значения только в 1 из 2 столбцов, их не следует удалять. Из дублированных строк я хотел бы сохранить ту, в которой столбец с наибольшим значением найден в другом столбце (с именем «Fold»). Помимо этой задачи, 4-й столбец (с именем «Имя») также требует некоторых замен символов следующим образом:

Из этого:

ID  Name                    Fold   Up           Down
1   mRNA_splicing(5)        3.2    a,b,c,d,e    f,g,h,i 
2   mRNA_processing(7)      3.1    a,b,c,d,e    f,g,h,i 
3   adherens_junctions(5)   2.6    k,l,m        p,q,r,s,t,u
4   glucose_transport(4)    3.4    d,j,n        o,p,v,w,z              
5   hexose_transport(2)     3.5    d,j,n        o,p,v,w,y,z

Я хотел бы получить это:

ID  Name                    Fold   Up           Down
1   mRNA splicing           3.2    a,b,c,d,e    f,g,h,i  
2   adherens junctions      2.6    k,l,m        p,q,r,s,t,u
3   glucose transport       3.4    d,j,n        o,p,v,w,z              
4   hexose transport        3.5    d,j,n        o,p,v,w,y,z

Что касается функций, которые выполняют удаление дублированных строк, то ни duplicate, ни unique не работают с символами, что здесь делать? Я ценю ваши элегантные решения.

Ответы [ 3 ]

2 голосов
/ 24 октября 2019

Использование решения таблицы данных:

dt <- as.data.table(your_df)
dt <- dt[dt[, .I[Fold == max(Fold)], by=list(Up, Down)]$V1]
dt[["Name"]] <- gsub("_", " ", sub("\\(.*?\\)$", "", dt[["Name"]]))
dt

   ID               Name Fold        Up        Down
1:  1      mRNA splicing  3.2 a,b,c,d,e     f,g,h,i
2:  3 adherens junctions  2.6     k,l,m p,q,r,s,t,u
3:  4  glucose transport  3.4     d,j,n   o,p,v,w,z
4:  5   hexose transport  3.5     d,j,n o,p,v,w,y,z
1 голос
/ 24 октября 2019

Решение в base R:

df <- df[order(df$Fold, decreasing = TRUE),]
df <- df[!(duplicated(df$Up) & duplicated(df$Down)),]
df$Name <- gsub("_", " ", gsub('.{0,3}$', '', df$Name))
df <- df[order(df$ID),]

Данные

df <- read.table(text = "
ID  Name                    Fold   Up           Down
1   mRNA_splicing(5)        3.2    a,b,c,d,e    f,g,h,i 
                 2   mRNA_processing(7)      3.1    a,b,c,d,e    f,g,h,i 
                 3   adherens_junctions(5)   2.6    k,l,m        p,q,r,s,t,u
                 4   glucose_transport(4)    3.4    d,j,n        o,p,v,w,z              
                 5   hexose_transport(2)     3.5    d,j,n        o,p,v,w,y,z
                 ", header = TRUE)

df$Name <- as.character(df$Name)

Выход

   ID           Name    Fold        Up        Down
1  1      mRNA splicing  3.2 a,b,c,d,e     f,g,h,i
3  3 adherens junctions  2.6     k,l,m p,q,r,s,t,u
4  4  glucose transport  3.4     d,j,n   o,p,v,w,z
5  5   hexose transport  3.5     d,j,n o,p,v,w,y,z
0 голосов
/ 24 октября 2019

Использование dplyr + stringr ( отредактировано для включения предложения tmfmnk ):

df %>% 
    group_by(Up, Down) %>% 
    slice(which.max(Fold)) %>% 
    mutate(Name = str_remove(Name, "\\(.*?\\)"))

Вывод:

# A tibble: 4 x 5
# Groups:   Up, Down [4]
     ID Name                Fold Up        Down       
  <int> <chr>              <dbl> <chr>     <chr>      
1     1 mRNA_splicing        3.2 a,b,c,d,e f,g,h,i    
2     5 hexose_transport     3.5 d,j,n     o,p,v,w,y,z
3     4 glucose_transport    3.4 d,j,n     o,p,v,w,z  
4     3 adherens_junctions   2.6 k,l,m     p,q,r,s,t,u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...