[英]Add values to other values in another dataframe based on matching pair names in two columns of two dataframes in R
[英]R - matching values in a dataframe column to another dataframes row names
我認為這在R中是一個相當具有挑戰性的數據操作問題,並且一直在努力構建一個能夠實現這一目標的函數。 背景是組織籃球運動員,他們在不同的位置上一起進入陣容,取決於每個球員的位置。 為清楚起見,這里是我正在使用的數據幀的一個示例,有兩種不同的形式:
dput(my_df)
structure(list(Name = c("C.J. McCollum", "DeMar DeRozan", "Jimmy Butler",
"Jonas Valanciunas", "Kevin Durant", "Markieff Morris", "Pascal Siakam",
"Pau Gasol"), Pos1 = c("PG", "SG", "SG", "C", "SF", "SF", "PF",
"C"), Pos2 = c("SG", "", "SF", "", "PF", "PF", "", "")), .Names = c("Name",
"Pos1", "Pos2"), class = "data.frame", row.names = c(18L, 33L,
62L, 68L, 78L, 92L, 106L, 111L))
my_df
Name Pos1 Pos2
18 C.J. McCollum PG SG
33 DeMar DeRozan SG
62 Jimmy Butler SG SF
68 Jonas Valanciunas C
78 Kevin Durant SF PF
92 Markieff Morris SF PF
106 Pascal Siakam PF
111 Pau Gasol C
dput(my_df2)
structure(list(Name = c("C.J. McCollum", "DeMar DeRozan", "Jimmy Butler",
"Jonas Valanciunas", "Kevin Durant", "Markieff Morris", "Pascal Siakam",
"Pau Gasol"), Pos1 = c("PG", "SG", "SG", "C", "SF", "SF", "PF",
"C"), Pos2 = c("SG", "", "SF", "", "PF", "PF", "", ""), PG = c(1,
0, 0, 0, 0, 0, 0, 0), SG = c(1, 1, 1, 0, 0, 0, 0, 0), SF = c(0,
0, 1, 0, 1, 1, 0, 0), PF = c(0, 0, 0, 0, 1, 1, 1, 0), C = c(0,
0, 0, 1, 0, 0, 0, 1), BackupG = c(1, 1, 1, 0, 0, 0, 0, 0), BackupF = c(0,
0, 1, 0, 1, 1, 1, 0), Man8 = c(1, 1, 1, 1, 1, 1, 1, 1)), .Names = c("Name",
"Pos1", "Pos2", "PG", "SG", "SF", "PF", "C", "BackupG", "BackupF",
"Man8"), row.names = c(18L, 33L, 62L, 68L, 78L, 92L, 106L, 111L
), class = "data.frame")
my_df2
Name Pos1 Pos2 PG SG SF PF C BackupG BackupF Man8
18 C.J. McCollum PG SG 1 1 0 0 0 1 0 1
33 DeMar DeRozan SG 0 1 0 0 0 1 0 1
62 Jimmy Butler SG SF 0 1 1 0 0 1 1 1
68 Jonas Valanciunas C 0 0 0 0 1 0 0 1
78 Kevin Durant SF PF 0 0 1 1 0 0 1 1
92 Markieff Morris SF PF 0 0 1 1 0 0 1 1
106 Pascal Siakam PF 0 0 0 1 0 0 1 1
111 Pau Gasol C 0 0 0 0 1 0 0 1
在籃球陣容中,我們想要為籃球中的5個位置(PG,SG,PF,SF,C)中的每個位置設置1個玩家,我們還需要1個備用后衛(PG或SG是后衛),1個備用前鋒( PF或FS是前鋒,是第8位可以打任何位置的球員。 有了這8名玩家,我們可以用這種方式構建陣容:
Name
PG C.J. McCollum
SG DeMar DeRozan
PF Kevin Durant
SF Markieff Morris
C Pau Gasol
Backup G Jimmy Butler
Backup F Pascal Siakam
8th Man Jonas Valanciunas
當然,這有一些靈活性(凱文杜蘭特和馬基夫莫里斯本可以轉換,實際上有幾個球員可以在第二個數據幀中切換位置)。 我希望能夠以相當快的速度將my_df組織成第二種數據幀格式,從my_df獲取Pos1和Pos2列,能夠檢查第二個數據幀的rownames,然后填寫播放器名稱。
然而,這有一個難題。 值得注意的是,並非所有玩家都有第二個位置,但那些擁有第二個位置的玩家可以在兩個位置中列出。 (例如,Jimmy Butler可以設置為SG,SF,備用G,備用F或第8人,而Pau Gasol只能設置為C或第8人)。 此外,雖然CJ McCollum被列為PG和SG,但他是my_df中唯一被列為PG的玩家,因此必須進入第二個數據幀的PG行。
任何想法都贊賞這個! 如果需要,我可以提供更多上下文。
(編輯:可能編輯my_df,添加Pos3,Pos4,Pos5列以了解玩家是否可以作為備份G,備份F或第8人,也可以提供幫助,這是我目前正在處理的事情)。
編輯 - 請參閱簡化此網格,以便每個行和列都有一個值用於我的問題的修訂版本,這是一個更簡單的問題要解決,但會給我一個解決這個問題的方法!
如果有結果,這種方法可以保證返回結果,實際上它將返回所有可行的組合。
st<-as.matrix(my_df2[4:dim(my_df2)[2]]) # Make a numeric matrix
## allCombinationsAux may not be necessary if you are using a combinatorics library
allCombinationsAux<-function(z,nreg,x){
if(sum(nreg)>1){
innerLoop<-do.call(rbind,lapply(x[nreg&(z!=x)], test1,nreg&(z!=x),x))
ret<-cbind(z,innerLoop )
}
else{
ret<-x[nreg]
}
ret
}
## Find all the possible row combinations for the matrix
combs<-do.call(rbind,lapply(x,function(y) allCombinationsAux(y,y!=x,x)))
## Identify which combinations are valid
inds<-which(apply(combs,1,function(x) sum(diag(st[x,]))==8))
## Select valid matricies
validChoices<-lapply(inds,function(x) st[combs[x,],])
my_df2
一個矩陣 要使輸出看起來像您的示例,您可以運行
validChoices<-lapply(inds,function(x) {
matr<-st[combs[x,],]
retVal<-data.frame(Name=my_df2[combs[x,],"Name"])
rownames(retVal)<-colnames(matr)
retVal
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.