【问题标题】:Compare summary statistics for two dataframe with same columns比较具有相同列的两个数据框的汇总统计信息
【发布时间】:2018-03-10 04:05:10
【问题描述】:

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

数据帧 DPUT 结构

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")

请帮忙!!!

【问题讨论】:

  • 您应该在我们的网站中提供一个最小的可重现示例以获得更好的帮助。看看stackoverflow.com/questions/5963269/…
  • 添加了可重现的例子
  • 对不起,我是新人,你能告诉我如何接受答案
  • 您可以点击答案左侧的Tick 标记以接受它。

标签: r dataframe compare summary


【解决方案1】:

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

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 为例。最终结果看起来像这样。

【讨论】:

  • 天才 :D 谢谢!如果还有更简单的方法也请告知
  • 对不起我新的你能告诉我如何接受答案,找不到它
  • 嗨,我在执行类似 A1 A2 B1 B2 C1 C2 长度类字符模式字符时得到了不希望的结果,没有得到任何值作为摘要应该显示请帮助
  • 您可以使用dplyr::filter() 只为data1 和data2 选取数字列。例如,mtcars %>% filter(is.numeric)
【解决方案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")

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 2019-08-18
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    相关资源
    最近更新 更多