R - 聚合中的直方图数据

时间:2017-02-07 10:47:30

标签: r

使用如下数据框:

set.seed(100)
df <- data.frame(id = sample(1:5, 6, replace = TRUE),
                 prop1 = rep(c("A", "B"), 3),
                 prop2 = sample(c(TRUE, FALSE), 6, replace = TRUE),
                 prop3=sample(3:6, 6, replace = TRUE))

> df
  id prop1 prop2 prop3
1  2     A FALSE     4
2  2     B  TRUE     4
3  3     A FALSE     6
4  1     B  TRUE     5
5  3     A FALSE     3
6  3     B FALSE     4

我需要通过id进行聚合,以便对于每个col prop1propN,生成直方图数据,如下所示。

对于每个id

  • prop1需要捕获具有相同"A"的所有记录的离散值数量的比率 - "B" s,id s,可通过名称访问像prop1[["A"]]&amp; prop1[["B"]]

  • prop2需要捕获具有相同"TRUE"的所有记录的离散值数量的比率 - "FALSE" s,id s,可通过名称访问像prop1[["TRUE"]]&amp; prop1[["FALSE"]]

  • prop3需要捕获具有相同"3, 4, 5, 6"的所有记录的离散值数量id的比率,可通过prop1[["3"]]等名称访问prop1[["4"]] {1}},prop1[["5"]]prop1[["6"]]

如何使用以上格式完成prop1propN的聚合 - 使用基础R

更新:添加输出表示。

我不确定正确的数据类型来表示输出中的输出和各种组件。但是,输出的电子表格视图如下。实际上,所需的输出形式使得它可以用作id分布的查找表,以便进一步计算。

Treed

2 个答案:

答案 0 :(得分:2)

这是一个使用如下定义的自定义函数的想法:

它根据id拆分数据框,并应用公式(prop.table(table(...)))来查找比率。 n充当索引,以便确定您需要比率的列。例如,如果n为2,那么fun1将为列表中的每个元素应用找到第2列的比率的公式(对每个id有效)。最后,我们通过循环遍历2:ncol(df)(因此在您的情况下为2:4)来应用函数,以获得每个id的所有感兴趣列的比率。

#convert to factors to make sure you will get 0 frequencies with table as well
df[-1] <- lapply(df[-1], as.factor)

fun1 <- function(df, n){as.data.frame(t(sapply(split(df, df$id), function(i) 
                                                         prop.table(table(i[,n])))))}

data.frame(id = unique(sort(df$id)), 
           do.call(cbind, sapply(2:ncol(df), function(i)fun1(df, i))))

#   id        A         B FALSE. TRUE.        X3        X4  X5       X6
#1  1 0.0000000 1.0000000    0.0   1.0 0.0000000 0.0000000  1 0.0000000
#2  2 0.5000000 0.5000000    0.5   0.5 0.0000000 1.0000000  0 0.0000000
#3  3 0.6666667 0.3333333    1.0   0.0 0.3333333 0.3333333  0 0.3333333

构建它的另一种方法是创建一个列表,并使用原始df的列名命名列表的每个元素。即。

l1 <- sapply(2:ncol(df), function(i)fun1(df, i))
names(l1) <- names(df[-1])

#so you can extract each one separately,

l1[['prop1']]
#          A         B
#1 0.0000000 1.0000000
#2 0.5000000 0.5000000
#3 0.6666667 0.3333333

答案 1 :(得分:1)

我想你想要这个:

library(reshape)
df[-1] <- lapply(df[-1],as.factor)
# second, rearrange vars in a named vector
df <- melt(df,id=c("id"),variable_name = "prop")
df$prop <- as.factor(df$prop)

#third, make the histograms with ggplot2
library(ggplot2)

h <- ggplot(df,aes(x=id)) 
h + geom_bar(stat="count", aes(fill=id)) + facet_grid(~ prop + value)