在 R 中创建唯一值的数据集并确定重复元素的优先级

In R create dataset of unique values and prioritize elements of duplicates

我在 R 中有一个数据框,其中包含多个重复的组织。我想创建一个新的数据框,其中每个组织只列出一次。

OrgName<-c("Org1","Org2","Org3","Org2","Org2","Org3")
ProgramName<-c("P1","P2","P2","P1","P4","P3")
OrgType<-c("Consulting","Education","Government","Government","Consulting","Education")

df<-data.frame(OrgName,ProgramName,OrgType)

df2<-data.frame(matrix(NA,ncol=ncol(df),nrow=length(unique(df$OrgName))))

  OrgName ProgramName    OrgType
1    Org1          P1 Consulting
2    Org2          P2  Education
3    Org3          P2 Government
4    Org2          P1 Government
5    Org2          P4 Consulting
6    Org3          P3  Education

我能够在上面的第一列中做到这一点。但是为了填充后续的列,我需要指明要显示的 Program Name 和 Org Type,因为有多个值。

我想说的是,如果组织是 P1 的一部分,请在 ProgramName 字段中插入程序 1 的名称,并在 OrgType 字段中插入相关的组织类型。如果组织不属于 P1,则在 ProgramName 字段中插入使用 P2 的名称,并在 OrgType 字段中插入关联的组织类型。然后序列将优先 P3,然后是 P4。

A dplyr 选项将 arrange 您的数据 OrgNameProgramName 然后只有 select 每个 [=13= 的第一行].

library(dplyr)
dplyr::arrange(df, OrgName, ProgramName) %>% 
 group_by(OrgName) %>% 
 do(head(., 1)) %>% 
 ungroup()
#  A tibble: 3 x 3
#  OrgName ProgramName OrgType   
#  <fct>   <fct>       <fct>     
#1 Org1    P1          Consulting
#2 Org2    P1          Government
#3 Org3    P2          Government

使用data.table,用setDT转换成data.table,按'OrgName'、order、'OrgName'、[=20=分组] 并获取 Data.table (.SD)

子集的第一行
library(data.table)
setDT(df)[order(OrgName, ProgramName), head(.SD, 1), .(OrgName)]
#   OrgName ProgramName    OrgType
#1:    Org1          P1 Consulting
#2:    Org2          P1 Government
#3:    Org3          P2 Government

您可以使用 dplyr 来执行此操作——首先 arrange OrgNameProgramName 的 df,然后选择 distinctOrgName 字段,但选择保留所有字段:

require(dplyr)

df %>%
  arrange(OrgName, ProgramName) %>%
  distinct(OrgName, .keep_all = TRUE) %>%
  ungroup()

#   OrgName ProgramName    OrgType
# 1    Org1          P1 Consulting
# 2    Org2          P1 Government
# 3    Org3          P2 Government