匹配名称并将数据集更改为 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'列使用sub
、merge
这两个数据集进行提取,创建序列索引('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
我有两个这样的 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'列使用sub
、merge
这两个数据集进行提取,创建序列索引('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