簡體   English   中英

R-如何基於另一個矩陣中的元素更改一個矩陣中的值

[英]R - How to change values in one Matrix based on elements in another Matrix

我在R中具有以下協方差矩陣:

AB-2000 AB-2600 AB-3500 AC-0100 AD-0100 AF-0200
AB-2000 6.5 NA  -1.8    3.65    -17.96  -26.5
AB-2600 NA  7.18    NA  NA  NA  NA
AB-3500 -1.79   NA  5.4 NA  -4.63   NA
AC-0100 3.65    NA  NA  4.22    9.8 NA
AD-0100 -17.96  NA  -4.63   9.8 5.9 NA
AF-0200 -26.5   NA  NA  NA  NA  4.28

每列和每一行對應一個足球運動員(即AB-2000)。 因此,AB-2000,AB-2000的交集為該球員的表現提供了差異。 像AB-2000,AF-0200這樣的行給出了兩個玩家表現的協方差。

當前,矩陣顯示所有協方差值。 但是,並非所有協方差值都重要。 實際上,唯一重要的是兩個玩家在同一周玩同一游戲(在這種情況下,具有相同的游戲ID(GID))。

下表顯示了某周某位玩家的GID:

GID PLAYER
3467    AB-2000
3460    AB-2600
3463    AB-3500
3467    AC-0100
3458    AD-0100
3461    AF-0200

當兩個播放器具有相同的GID(例如,播放器AB-2000和AC-0100)時,如何只將值保留在協方差矩陣中?

謝謝您的幫助!

如果我正確地解釋了問題,我認為這符合您的要求。 我給了你一些解決方案,選擇你的毒葯。 第一個依賴於嵌套的for循環,如果您確定矩陣是對稱的,則嵌套循環可能會很慢並且可以進一步優化。

m <- read.table(header=T, stringsAsFactors=F, text="
AB-2000 AB-2600 AB-3500 AC-0100 AD-0100 AF-0200
AB-2000 6.5 NA  -1.8    3.65    -17.96  -26.5
AB-2600 NA  7.18    NA  NA  NA  NA
AB-3500 -1.79   NA  5.4 NA  -4.63   NA
AC-0100 3.65    NA  NA  4.22    9.8 NA
AD-0100 -17.96  NA  -4.63   9.8 5.9 NA
AF-0200 -26.5   NA  NA  NA  NA  4.28
")

p <- read.table(header=T, stringsAsFactors=F, text="
GID PLAYER
3467    AB-2000
3460    AB-2600
3463    AB-3500
3467    AC-0100
3458    AD-0100
3461    AF-0200
")

m_t2 <- cm
names(m_t2) <- row.names(m_t2)

##  Replace names with GID:
row_names <- p$GID[which(p$PLAYER == row.names(m_t2))]
col_names <- p$GID[which(p$PLAYER == names(m_t2))]
for (i in 1:nrow(m_t2)) {
  m_t2[i, col_names != row_names[i]] <- NA
}

m_t2 <- as.matrix(m_t2)

另外,此解決方案確實依賴於tidyrdplyr軟件包,但是對於非常大的數據集,它應該非常有效:

m <- cm
names(m) <- row.names(m)
m$row_names <- row.names(m)

library(tidyr)
library(dplyr)

d <- m %>% 
  gather(col_names, "cv", -row_names, convert=T) %>% 
  left_join(p, by = c("row_names" = "PLAYER")) %>% 
  mutate(GID_row = GID) %>% 
  select(-GID) %>% 
  left_join(p, by=c("col_names" = "PLAYER")) %>% 
  mutate(GID_col = GID) %>% 
  mutate(new_cv = ifelse((GID_row == GID_col), cv, NA)) %>%
  select(row_names, col_names, new_cv) %>% 
  spread(col_names, new_cv)

m_t <- as.matrix(d[,-1])
row.names(m_t) <- d[["row_names"]]

兩種情況下的解決方案如下所示:

> m_t
        AB-2000 AB-2600 AB-3500 AC-0100 AD-0100 AF-0200
AB-2000    6.50      NA      NA    3.65      NA      NA
AB-2600      NA    7.18      NA      NA      NA      NA
AB-3500      NA      NA     5.4      NA      NA      NA
AC-0100    3.65      NA      NA    4.22      NA      NA
AD-0100      NA      NA      NA      NA     5.9      NA
AF-0200      NA      NA      NA      NA      NA    4.28

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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