在 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
您的数据 OrgName
和 ProgramName
然后只有 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
OrgName
和 ProgramName
的 df,然后选择 distinct
行OrgName
字段,但选择保留所有字段:
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
我在 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
您的数据 OrgName
和 ProgramName
然后只有 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
OrgName
和 ProgramName
的 df,然后选择 distinct
行OrgName
字段,但选择保留所有字段:
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