比较具有相同列的两个数据框的摘要统计信息

Compare summary statistics for two dataframe with same columns

我有两个数据框 A 和 B,除了主键外,它们都有相同的列(在真实数据中,我有超过 50 多个这样的列),现在我想比较 'summary' 统计数据(正常R summary() 命令)用于两个数据框,但出于比较目的,我想看到它们彼此相邻,如附图所示。

数据帧输出结构

structure(list(Pkey = c(1, 2, 3, 4, 5), Phy_marks = c(43, 44,  45,
    46, 47), Math_marks = c(34, 34, 45, 32, 21)), .Names = c("Pkey", 
    "Phy_marks", "Math_marks"), row.names = c(NA, -5L), class =
    "data.frame")

structure(list(Pkey = c(11, 12, 13, 14, 15), Phy_marks = c(43,  44,
    45, 46, 47), Math_marks = c(34, 34, 45, 32, 21)), .Names = c("Pkey",
    "Phy_marks", "Math_marks"), row.names = c(NA, -5L), class =
    "data.frame")

请帮忙!!!

您可以利用我在下面创建的函数来比较两个数据集。

library(dplyr)
compare_them <- function(data1,data2) {
  sum1 <- apply(data1,2,summary) %>% data.frame() 
  sum2 <- apply(data2,2,summary) %>% data.frame() 

  names(sum1) <- paste0(names(sum1),"1")
  names(sum2) <- paste0(names(sum2),"2")

  final <- cbind(sum1,sum2)

  final1 <- t(final) 

  final2 <- final1[order(row.names(final1)), ]

  final_1 <- t(final2) %>% data.frame()
  final_1
}

compare_them(mtcars,mtcars*2) %>% View()

data1 变量以“1”结尾,data2 变量以“2”结尾。我以 mtcars 和 mtcars*2 为例。最终结果如下所示。

一个选项是使用 summarise.alldcastuniteseparate 来计算每个 data.frame 排列所需的统计数据。

注意:OP 提供的示例数据已针对 df_b 进行了略微修改,使其具有与 df_a 不同的统计数据。

library(tidyverse)
library(reshape2)

df_a %>% mutate(Grp = "A") %>%
bind_rows(mutate(df_b, Grp = "B"))  %>% 
  select(-Pkey) %>% 
  group_by(Grp) %>% {
    inner_join(inner_join(inner_join(summarise_all(.,funs(min,mean,median, max)),
        summarise_all(.,funs(Q1 = quantile), probs = 0.25), by = "Grp"),
        summarise_all(.,funs(Q2 = quantile), probs = 0.50), by = "Grp"),
        summarise_all(.,funs(Q3 = quantile), probs = 0.75), by = "Grp"
  )
} %>% as.data.frame() %>%
  gather(key, val, -Grp) %>%
  separate("key", c("sub", "param"), sep = "_") %>%
  unite("sub", c("sub", "Grp"), sep = "_") %>%
  dcast(param~sub, value.var = "val") %>%
  select_at(vars(param, sort(names(select(.,-param)))))

#   param Math.marks_A Math.marks_B Phy.marks_A Phy.marks_B
#1    max         45.0        100.0          47        99.0
#2   mean         33.2         66.4          45        63.6
#3 median         34.0         80.0          45        60.0
#4    min         21.0         24.0          43        25.0
#5     Q1         32.0         40.0          44        44.0
#6     Q2         34.0         80.0          45        60.0
#7     Q3         34.0         88.0          46        90.0

数据

df_a <- structure(list(Pkey = c(1, 2, 3, 4, 5), 
Phy.marks = c(43, 44,  45, 46, 47), Math.marks = c(34, 34, 45, 32, 21)), 
.Names = c("Pkey", "Phy.marks", "Math.marks"), 
row.names = c(NA, -5L), class = "data.frame")

df_b <- structure(list(Pkey = c(11, 12, 13, 14, 15), 
Phy.marks = c(90,  44, 60, 25, 99), 
Math.marks = c(24, 40, 80, 88, 100)), 
.Names = c("Pkey", "Phy.marks", "Math.marks"), 
row.names = c(NA, -5L), class = "data.frame")