使用摘要数据创建数据框

时间:2016-01-26 21:06:35

标签: python r bash pandas dplyr

我有一个大型数据框(数百万行x十几列),我希望得到一些摘要数据。总的来说,我有多达800,000可能"名称" s,如本示例所示,以及最多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

我想要Name列中每个项目的每个Value的比例。在此示例中,有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并且可以做到。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

使用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)
})