簡體   English   中英

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,],])
  1. my_df2一個矩陣
  2. 找到所有可能的矩陣替換
  3. 迭代所有可能的矩陣測試diags是否全部為1
  4. 選擇那些有效的矩陣

要使輸出看起來像您的示例,您可以運行

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM