匹配名称并将数据集更改为 r 中的宽格式

Match name and change data set to wide format in r

我有两个这样的 df:

Name1            Task   Bond    Goal    Name2          Rapport  Client
Abigail Adkins   24     20       25     Adam Tharkur    4.08    4.29
Abigail Brusse   25     26       24     Adam Tharkur    6.08    6
Adam Tharker     24     24       24     Anne Corinne    5.5     6.29
Adriel Parks     27     18       26     Alan Hamaoui    7       6.43
Allison Mofsky   21     28       20     Alyssa Sorrells 5.67    5.29

df1 有 Name1、Task、Bond 和 Goal,df2 有 Name2、Rapport 和 Client。 我的目标是 select 两个 df 中相同的名字,并且他们的五个分数是这样的:

Name   Task     Bond     Goal    Rapport1   Client1  Rapport2   Client2
Adam    24      24       24      4.08       4.29     6.08       6

每个名字可能有多个观察值(少于10个)像"Adam",而我只想匹配selection中的名字,因为有些我没有输入姓氏。有人有什么想法吗?非常感谢。

可重现的数据:

dat <- read.csv(text="Name1,Task,Bond,Goal,Name2,Rapport,Client
Abigail Adkins,24,20,25,Adam Tharkur,4.08,4.29
Abigail Brusse,25,26,24,Adam Tharkur,6.08,6
Adam Tharker,24,24,24,Anne Corinne,5.5,6.29
Adriel Parks,27,18,26,Alan Hamaoui,7,6.43
Allison Mofsky,21,28,20,Alyssa Sorrells,5.67,5.29",header=TRUE,stringsAsFactors=FALSE)

df1 <- dat[1:4]
df2 <- dat[5:7]

'first names'可以通过'Name'列使用submerge这两个数据集进行提取,创建序列索引('indx')分组变量 ('Name1'),并使用 reshape 将格式从 'long' 更改为 'wide'。

df1$Name1 <- sub(' .*$', '', df1$Name1)
df2$Name2 <- sub(' .*$', '', df2$Name2)
dfN <- merge(df1, df2, by.x='Name1', by.y='Name2')
dfN$indx <- with(dfN, ave(seq_along(Name1), Name1, FUN=seq_along))
reshape(dfN, idvar=c('Name1', 'Task', 'Bond', 'Goal'), 
             timevar='indx', direction='wide')
#   Name1 Task Bond Goal Rapport.1 Client.1 Rapport.2 Client.2
#1  Adam   24   24   24      4.08     4.29      6.08        6

或者我们可以使用 data.table 的开发版本,即 v1.9.5。安装说明为 here.

删除两个数据集'Name'列中的'last name'(如上所示),然后将'df1'转换为'data.table'(setDT(df1)) , 并将键列设置为 'Name1' (setkey(.., Name1))。使用 'df2' 加入,为 'Name1' 创建一个序列列 ('N'),然后使用 dcast。在开发版本中,dcast 可以包含多个 value.var 列。

library(data.table)#v1.9.5+
dcast(setkey(setDT(df1), Name1)[df2, nomatch=0][, N:=1:.N, Name1],
             ...~N, value.var= c('Rapport', 'Client'))
#    Name1 Task Bond Goal 1_Rapport 2_Rapport 1_Client 2_Client
#1:  Adam   24   24   24      4.08      6.08     4.29        6