创建一个新列,作为R组内的价值共识

创建一个新列,作为R组内的价值共识,r,dplyr,R,Dplyr,你好,我有一个数据帧,比如 Groups COL1 G1 Unknown_RNA G1 Unknown_RNA G1 A G1 A G1 Unknown_RNA G2 B G2 A G2 B G3 Unknown_RNA G3 A G4 Unknown_RNA G4 Unknown_RNA G4 Unknown_RN

你好,我有一个数据帧,比如

Groups COL1         
G1     Unknown_RNA  
G1     Unknown_RNA  
G1     A            
G1     A            
G1     Unknown_RNA
G2     B
G2     A 
G2     B 
G3     Unknown_RNA
G3     A
G4     Unknown_RNA
G4     Unknown_RNA
G4     Unknown_RNA
然后我应该在
df$COL1
中保留最具代表性的值,并将其放在
consenseus\u COL1
列中,而不考虑值
Unknown\u RNA
(组中只有该值时除外)

在这里我应该得到:

Groups COL1         consensus_COL1         
G1     Unknown_RNA  A
G1     Unknown_RNA  A
G1     A            A            
G1     A            A     
G1     Unknown_RNA  A 
G2     B            B
G2     A            B 
G2     B            B 
G3     Unknown_RNA  A
G3     A            A
G4     Unknown_RNA  Unknown_RNA 
G4     Unknown_RNA  Unknown_RNA 
G4     Unknown_RNA  Unknown_RNA 
到目前为止,我只知道如何保持最具代表性的价值:

 df %>% filter(COL1 != "") %>%
  group_by(Groups) %>%
  add_count(COL1) %>%
  top_n(1, n) %>%
  distinct(consensus_COL1 = COL1) %>%
  right_join(df)
但我不知道如何添加
Unknown\u RNA
问题

这是数据

structure(list(Groups = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 3L, 3L, 4L, 4L, 4L), .Label = c("G1", "G2", "G3", "G4"), class = "factor"), 
    COL1 = structure(c(3L, 3L, 1L, 1L, 3L, 2L, 1L, 2L, 3L, 1L, 
    3L, 3L, 3L), .Label = c("A", "B", "Unknown_RNA"), class = "factor")), class = "data.frame", row.names = c(NA, 
-13L))

一种简单的方法是在获得计数后过滤掉
Unknown\u RNA
,然后
left\u用原始数据框加入该数据,并用
Unknown\u RNA

库(tidyverse)
df%
as_tible()%>%
分组依据(组)%>%
计数(COL1)%>%
过滤器(COL1!=“未知RNA”)%>%
前n(1,n)%>%
选择(-n)->tb\u df
tb_df
#>#tibble:3 x 2
#>#组:组[3]
#>组COL1
#>     
#>1 G1 A
#>2 G2 B
#>3 G3 A
df%>%
选择(-2)%>%
左联合(tb\U df)%>%
突变(COL1=COL1%>%替换RNA(“未知RNA”))%>%
重命名(一致性_COL1=COL1)%>%
突变(COL1=df$COL1)
#>加入,由=“组”
#>团体共识(COL1 COL1)
#>1 G1一个未知的核糖核酸
#>2 G1未知的核糖核酸
#>3 G1A
#>4 G1A
#>5 G1未知的核糖核酸
#>6g2b
#>7 G2 B A
#>8 G2 B
#>9 G3未知的RNA
#>10 G3A
#>11 G4未知核糖核酸未知核糖核酸
#>12 G4未知核糖核酸未知核糖核酸
#>13 G4未知核糖核酸未知核糖核酸

由(v0.3.0)于2021年1月29日创建,我们可以在单个管道中进行此操作,方法是将对应于“未知”RNA的“n”值替换为
NA

library(dplyr)
library(tibble)
df1 %>%
  add_count(Groups, COL1) %>% 
  mutate(n = replace(n, COL1 == 'Unknown_RNA', NA)) %>%
  group_by(Groups) %>% 
  mutate(consensus_COL1 = if(all(is.na(n))) 'Unknown_RNA' else COL1[which.max(n)])
# A tibble: 13 x 4
# Groups:   Groups [4]
#   Groups COL1            n consensus_COL1
#   <fct>  <fct>       <int> <chr>         
# 1 G1     Unknown_RNA    NA A             
# 2 G1     Unknown_RNA    NA A             
# 3 G1     A               2 A             
# 4 G1     A               2 A             
# 5 G1     Unknown_RNA    NA A             
# 6 G2     B               2 B             
# 7 G2     A               1 B             
# 8 G2     B               2 B             
# 9 G3     Unknown_RNA    NA A             
#10 G3     A               1 A             
#11 G4     Unknown_RNA    NA Unknown_RNA   
#12 G4     Unknown_RNA    NA Unknown_RNA   
#13 G4     Unknown_RNA    NA Unknown_RNA   
库(dplyr)
图书馆(tibble)
df1%>%
添加计数(组,列1)%>%
突变(n=replace(n,COL1=='Unknown_RNA',NA))%>%
分组依据(组)%>%
突变(一致性_COL1=if(all(is.na(n)))'Unknown_RNA'else COL1[which.max(n)])
#一个tibble:13x4
#分组:分组[4]
#组COL1 n共识_COL1
#                      
#1 G1未知的核糖核酸A
#2 G1未知核糖核酸A
#3 G1 A 2 A
#4 G1 A 2 A
#5 G1未知核糖核酸A
#6G2B2B
#7 G2 A 1 B
#8G2B2B
#9 G3未知核糖核酸A
#10 G3 A 1 A
#11 G4未知核糖核酸未知核糖核酸
#12 G4未知核糖核酸未知核糖核酸
#13 G4未知核糖核酸未知核糖核酸

非常感谢您的帮助和时间,如果我不想添加另一个异常,例如
未知\u DNA
,我可以在%c('Unknown\u RNA','Unknown\u DNA')中使用类似
%的东西吗?
替换中,您可以转换为使用
列%c(…)
要转换为NAthanks以获得您的帮助,它就像一个charme