2015-04-08 19 views
2

設置爲寬幅我有兩個DF是這樣的:比賽名稱和更改數據r中

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有名稱1,任務,債券和目標,DF2有名稱2,融洽和客戶端。 我的目標是選擇有兩種DFS相同的名字,並有自己的5個分數是這樣的:

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

每個名稱可能有多個觀測值(小於10),如「亞當」,只有我想要匹配選擇中的名字,因爲有些我沒有輸入姓氏。有人有什麼想法嗎?萬分感謝。

重現的數據:

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] 
+0

不應該是'df1 < - dat [1:4]'和'df2 < - dat [5:7]'? – Molx

+0

另外,你有'df1'中的多個貨幣的名稱,或只有'df2'? 「Tharker」與「Tharkur」有什麼不同?因爲那樣你就必須與每一個亞當相匹配。 – Molx

+0

你有沒有在df1中使用「Tharker」而在df2中使用「Tharkur」?在這方面,我不確定什麼「我只想匹配seletion中的名字」意思是...... –

回答

4

「第一名字」可使用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

刪除兩個數據集'名稱'列中的'姓氏'(如上所示),然後將'df1'轉換爲'data.table'(setDT(df1)),並將鍵列設置爲'Name1' (setkey(.., Name1))。加入'df2',爲'Name1'創建一個序列列('N'),並使用dcast。在devel版本中,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 
+0

你能解釋dfN $ indx行嗎?它是否爲每行添加了一個連續的數字,以便重塑中的timevar執行某些操作?謝謝你,akrun。 – lawyeR

+0

@lawyeR是的,它爲組'Name1'添加了一個連續編號,以便它可以用於'reshape'行。 – akrun