【问题标题】:Create dataframe with summary data [duplicate]使用摘要数据创建数据框[重复]
【发布时间】:2016-01-26 21:06:35
【问题描述】:

我有一个大型数据框(数百万行 x 十几列),我想获取一些摘要数据。总体而言,如本例所示,我有多达 800,000 个可能的“名称”,以及多达 440 个样本中的 6 个可能值。

这是我拥有和想要的玩具示例:

起始表:

Name   Chr   Pos   Sample  Value
RS1    1     1000   S1      1
RS1    1     1000   S2      1    
RS1    1     1000   S3      2
RS1    1     1000   S4      3
RS1    1     1000   S5      1
RS1    1     1000   S6      2

我想要名称列中每个项目的每个值的比例。在此示例中,有 6 个样本,具有 3 个可能的值。因此,我的输出将是:

Name   Chr    Pos   Value   Proportion
RS1    1      1000   1      0.5
RS1    1      1000   2      0.33
RS1    1      1000   3      0.17

我愿意在 R (dplyr?) 或 Python (使用 base 或 pandas??) 中执行此操作,如果有意义的话,甚至可以使用 bash 脚本。我正在寻找可以节省时间和内存的东西。我对 R 有一定的了解,但我刚开始学习 Python 和它所能做的一切。

【问题讨论】:

  • 你在这之后吗:stackoverflow.com/questions/32122300/… 如果是这样,我将作为骗子关闭
  • 对于那么大的事情,R 的data.table,或者可能是 SQL。您可以使用 dplyr 轻松完成此操作,但对于该大小,它可能会很慢。
  • 我认为熊猫的答案会起作用。我正在尝试。显然,我搜索了错误的术语。我担心 R 会阻塞这么多数据,或者速度非常慢,但如果我不能让 pandas 工作,我会看看。我无法将它导入数据库,因此我可以使用 SQL,但那将是理想的。

标签: python r bash pandas dplyr


【解决方案1】:

不是更优雅的答案,但它对我有用:

toy <- tbl_df(toy)
toy$Chr <- as.factor(toy$Chr)
toy$Pos <- as.factor(toy$Pos)
toy$Value <- as.factor(toy$Value)

df <- as.data.frame(toy %>% 
  group_by(Name, Chr, Pos, Value) %>% 
  tally %>% 
  group_by(Name, Value))

df %>% 
  mutate(pct = n/sum(n))

【讨论】:

  • 这在我的一个较小数据集上的 R 中对我有用,尽管速度很慢。我希望它仍然适用于我的大型数据集。谢谢。
【解决方案2】:

使用plyr。下面,d 是起始表,output 是结果。

library(plyr)
output = ddply(d, "Name", function(x){
  tab = table(x$Value)/length(x$Value)
  prop = as.numeric(tab)
  val = names(tab)
  data.frame(Name = x$Name[1], Chr = x$Chr[1], Pos = x$Pos[1], Value = val, Proportion = prop)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2022-01-07
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多