У меня два ДФ:

passesComb <- structure(list(P1_Good = c(0, 1, 0, 0, 0, 0, 1), P2_Good = c(2, 
0, 0, 0, 0, 0, 2), P3_Good = c(0, 1, 0, 0, 0, 0, 1), P4_Good = c(0, 
0, 1, 0, 0, 0, 1), P5_Good = c(0, 0, 0, 1, 0, 0, 1), P1_Bad = c(0, 
0, 0, 0, 0, 0, 0), P2_Bad = c(0, 0, 0, 0, 0, 0, 0), P3_Bad = c(0, 
0, 0, 0, 0, 0, 0), P4_Bad = c(0, 0, 1, 0, 0, 0, 1), P5_Bad = c(0, 
0, 0, 0, 0, 0, 0), `Bad Pass` = c(0, 0, 1, 0, 0, 1, 1), `Good Pass` = c(2, 
2, 1, 1, 0, 3, 6), `Intercepted Pass` = c(0, 0, 0, 0, 0, 1, 0
), Turnover = c(0, 0, 0, 0, 0, 1, 0), totalEvents = c(2, 2, 2, 
1, 0, 6, 7)), row.names = c("P1", "P2", "P3", "P4", "P5", "Opponent", 
"VT"), class = "data.frame")

Размером 7x15, и

copyComb <- structure(list(P1_Good = c(0, 1, 0, 0, 0, 1), P2_Good = c(2, 
0, 0, 0, 0, 2), P4_Good = c(0, 0, 0, 0, 0, 0), P5_Good = c(0, 
0, 1, 0, 0, 1), P1_Bad = c(0, 0, 0, 0, 0, 0), P2_Bad = c(0, 0, 
0, 0, 0, 0), P3_Bad = c(0, 0, 0, 0, 0, 0), P4_Bad = c(0, 0, 0, 
0, 0, 0), P5_Bad = c(0, 0, 0, 0, 0, 0), `Bad Pass` = c(0, 0, 
0, 0, 1, 0), `Good Pass` = c(2, 1, 1, 0, 3, 4), `Intercepted Pass` = c(0, 
0, 0, 0, 1, 0), Turnover = c(0, 0, 0, 0, 1, 0), totalEvents = c(2, 
1, 1, 0, 6, 4)), row.names = c("P1", "P2", "P4", "P5", "Opponent", 
"VT"), class = "data.frame")

Или просто,

copyComb <- passesComb
copyComb <- copyComb[-3,-3]
#Updating specific cells since [3,3] is removed
copyComb[2,11] <- 1
copyComb[2,14] <- 1
copyComb[6,8] <- 0
copyComb[6,3] <- 0
copyComb[6,10] <- 0
copyComb[6,11] <- 4
copyComb[6,14] <- 4
#This now equals the copyComb from dput() above

Размером 6х14.

Я пытаюсь объединить / добавить эти два df вместе на основе совпадающих имен строк / столбцов. Я попытался добиться этого, используя код из ответа на вопрос этот пост

gamesComb <- data.frame(matrix(NA, nrow = ifelse(nrow(passesComb) >= nrow(copyComb), nrow(passesComb),nrow(copyComb)),
                               ncol = ifelse(ncol(passesComb) >= ncol(copyComb), ncol(passesComb),ncol(copyComb))))
                        
gamesComb[row.names(ifelse(nrow(passesComb) >= nrow(copyComb), passesComb, copyComb)),
                           colnames(ifelse(ncol(passesComb) >= ncol(copyComb), passesComb, copyComb))] <- passesComb

Здесь я создаю df, gamesComb и устанавливаю размеры того, что больше passesComb или copyComb. Он создает df 7x15, но не добавляет имена строк / столбцов.

Я также пытаюсь затем добавить 2 df вместе на основе значения ячейки, если у них одинаковое имя строки / столбца (такое же, как в ссылке выше), то есть passesComb["P2","P1_Good"] = 1 и copyComb["P2","P1_Good"] = 1, поэтому gamesComb["P2","P1_Good"] должно = 2, и то же самое для всех похожих имен строк / столбцов.

Итак, окончательный результат выглядит так:

expectedOutput <- structure(list(P1_Good = c(0, 2, 0, 0, 0, 0, 2), P2_Good = c(4, 
0, 0, 0, 0, 0, 4), P3_Good = c(0, 1, 0, 0, 0, 0, 1), P4_Good = c(0, 
0, 1, 0, 0, 0, 1), P5_Good = c(0, 0, 0, 2, 0, 0, 2), P1_Bad = c(0, 
0, 0, 0, 0, 0, 0), P2_Bad = c(0, 0, 0, 0, 0, 0, 0), P3_Bad = c(0, 
0, 0, 0, 0, 0, 0), P4_Bad = c(0, 0, 1, 0, 0, 0, 1), P5_Bad = c(0, 
0, 0, 0, 0, 0, 0), `Bad Pass` = c(0, 0, 1, 0, 0, 2, 1), `Good Pass` = c(4, 
3, 1, 2, 0, 6, 10), `Intercepted Pass` = c(0, 0, 0, 0, 0, 2, 
0), Turnover = c(0, 0, 0, 0, 0, 2, 0), totalEvents = c(4, 3, 
2, 2, 0, 12, 11)), row.names = c("P1", "P2", "P3", "P4", "P5", 
"Opponent", "VT"), class = "data.frame")
1
samrizz4 9 Окт 2021 в 22:58

2 ответа

Лучший ответ

Другой вариант - сложить их, а затем суммировать по группам имен.

library(dplyr, warn.conflicts = FALSE)
library(tibble)

out <- 
  rownames_to_column(passesComb) %>% 
    bind_rows(rownames_to_column(copyComb)) %>% 
    # bind_rows(rownames_to_column(third_table)) %>% if you want to add another
    select(rowname, names(passesComb)) %>% 
    group_by(rowname) %>% 
    summarise(across(everything(), sum, na.rm = T)) %>% 
    slice(match(rownames(passesComb), rowname)) %>% 
    column_to_rownames('rowname')
  
all.equal(out, expectedOutput)
#> [1] TRUE

Создано 2021-10-09 пакетом REPEX (v2.0.1)

1
IceCreamToucan 9 Окт 2021 в 21:16

Вот подход dplyr / tidyr, при котором я преобразовываю каждую таблицу в длинный формат, затем объединяю их, суммирую и снова расширяю.

library(dplyr); library(tidyr)
lengthen <- function(df) { df %>% rownames_to_column(var = "row") %>% pivot_longer(-row)}

full_join(lengthen(passesComb), lengthen(copyComb), by = c("row", "name")) %>%
  mutate(new_val = coalesce(value.x, 0) + coalesce(value.y, 0)) %>%
  select(-starts_with("value")) %>%
  pivot_wider(names_from = name,values_from = new_val)
2
Jon Spring 9 Окт 2021 в 20:36